summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am78
-rw-r--r--bgpd/bgp_bfd.c2
-rw-r--r--bgpd/bgp_bfd.h4
-rw-r--r--bgpd/bgp_damp.c4
-rw-r--r--bgpd/bgp_damp.h7
-rw-r--r--bgpd/bgp_evpn_vty.c38
-rw-r--r--bgpd/bgp_filter.c61
-rw-r--r--bgpd/bgp_keepalives.c6
-rw-r--r--bgpd/bgp_mplsvpn.c10
-rw-r--r--bgpd/bgp_mplsvpn.h2
-rw-r--r--bgpd/bgp_open.c4
-rw-r--r--bgpd/bgp_open.h4
-rw-r--r--bgpd/bgp_route.c119
-rw-r--r--bgpd/bgp_route.h7
-rw-r--r--bgpd/bgp_vpn.c2
-rw-r--r--bgpd/bgp_vpn.h2
-rw-r--r--bgpd/bgp_vty.c105
-rw-r--r--bgpd/bgp_vty.h5
-rw-r--r--bgpd/bgpd.c6
-rw-r--r--bgpd/bgpd.h3
-rw-r--r--bgpd/rfapi/bgp_rfapi_cfg.c42
-rw-r--r--bgpd/rfapi/bgp_rfapi_cfg.h8
-rw-r--r--bgpd/rfapi/rfapi.c32
-rw-r--r--bgpd/rfapi/rfapi_ap.c2
-rw-r--r--bgpd/rfapi/rfapi_import.c366
-rw-r--r--bgpd/rfapi/rfapi_import.h33
-rw-r--r--bgpd/rfapi/rfapi_monitor.c181
-rw-r--r--bgpd/rfapi/rfapi_monitor.h38
-rw-r--r--bgpd/rfapi/rfapi_nve_addr.c2
-rw-r--r--bgpd/rfapi/rfapi_private.h16
-rw-r--r--bgpd/rfapi/rfapi_rib.c209
-rw-r--r--bgpd/rfapi/rfapi_rib.h12
-rw-r--r--bgpd/rfapi/rfapi_vty.c26
-rw-r--r--bgpd/rfapi/rfapi_vty.h2
-rw-r--r--bgpd/rfapi/vnc_export_bgp.c60
-rw-r--r--bgpd/rfapi/vnc_export_bgp_p.h8
-rw-r--r--bgpd/rfapi/vnc_export_table.c42
-rw-r--r--bgpd/rfapi/vnc_export_table.h10
-rw-r--r--bgpd/rfapi/vnc_import_bgp.c84
-rw-r--r--bgpd/rfapi/vnc_import_bgp_p.h8
-rw-r--r--bgpd/rfapi/vnc_zebra.c22
-rw-r--r--bgpd/rfapi/vnc_zebra.h4
-rw-r--r--bgpd/rfp-example/librfp/rfp_example.c2
-rw-r--r--common.am4
-rwxr-xr-xconfigure.ac186
-rw-r--r--debianpkg/Makefile.am47
-rw-r--r--debianpkg/subdir.am72
-rw-r--r--doc/.gitignore3
-rw-r--r--doc/Makefile18
-rw-r--r--doc/Makefile.am293
-rw-r--r--doc/developer/Makefile16
-rw-r--r--doc/developer/Makefile.am8
-rw-r--r--doc/developer/building-frr-for-alpine.rst (renamed from doc/developer/building-frr-on-alpine.rst)0
-rw-r--r--doc/developer/building-frr-for-centos6.rst (renamed from doc/developer/building-frr-on-centos6.rst)214
-rw-r--r--doc/developer/building-frr-for-centos7.rst (renamed from doc/developer/building-frr-on-centos7.rst)0
-rw-r--r--doc/developer/building-frr-for-debian8.rst (renamed from doc/developer/building-frr-on-debian8.rst)0
-rw-r--r--doc/developer/building-frr-for-debian9.rst (renamed from doc/developer/building-frr-on-debian9.rst)0
-rw-r--r--doc/developer/building-frr-for-fedora24.rst (renamed from doc/developer/building-frr-on-fedora24.rst)0
-rw-r--r--doc/developer/building-frr-for-freebsd10.rst (renamed from doc/developer/building-frr-on-freebsd10.rst)57
-rw-r--r--doc/developer/building-frr-for-freebsd11.rst133
-rw-r--r--doc/developer/building-frr-for-freebsd9.rst (renamed from doc/developer/building-frr-on-freebsd9.rst)57
-rw-r--r--doc/developer/building-frr-for-netbsd6.rst (renamed from doc/developer/building-frr-on-netbsd6.rst)0
-rw-r--r--doc/developer/building-frr-for-netbsd7.rst (renamed from doc/developer/building-frr-on-netbsd7.rst)0
-rw-r--r--doc/developer/building-frr-for-omnios.rst (renamed from doc/developer/building-frr-on-omnios.rst)0
-rw-r--r--doc/developer/building-frr-for-openbsd6.rst (renamed from doc/developer/building-frr-on-openbsd6.rst)0
-rw-r--r--doc/developer/building-frr-for-openwrt.rst77
-rw-r--r--doc/developer/building-frr-for-ubuntu1204.rst (renamed from doc/developer/building-frr-on-ubuntu1204.rst)0
-rw-r--r--doc/developer/building-frr-for-ubuntu1404.rst (renamed from doc/developer/building-frr-on-ubuntu1404.rst)0
-rw-r--r--doc/developer/building-frr-for-ubuntu1604.rst (renamed from doc/developer/building-frr-on-ubuntu1604.rst)0
-rw-r--r--doc/developer/building-frr-for-ubuntu1804.rst (renamed from doc/developer/building-frr-on-ubuntu1804.rst)0
-rw-r--r--doc/developer/building-frr-on-freebsd11.rst109
-rw-r--r--doc/developer/building-frr-on-lede-openwrt.rst108
-rw-r--r--doc/developer/building.rst2
-rw-r--r--doc/developer/subdir.am72
-rw-r--r--doc/frr-sphinx.mk229
-rw-r--r--doc/manpages/Makefile12
-rw-r--r--doc/manpages/Makefile.am48
-rw-r--r--doc/manpages/subdir.am139
-rw-r--r--doc/subdir.am176
-rw-r--r--doc/user/Makefile16
-rw-r--r--doc/user/Makefile.am55
-rw-r--r--doc/user/_static/overrides.css18
-rw-r--r--doc/user/overview.rst98
-rw-r--r--doc/user/subdir.am110
-rw-r--r--doc/user/zebra.rst2
-rw-r--r--lib/agg_table.c59
-rw-r--r--lib/agg_table.h153
-rw-r--r--lib/bfd.c6
-rw-r--r--lib/bfd.h4
-rw-r--r--lib/frr_pthread.c42
-rw-r--r--lib/frr_pthread.h14
-rw-r--r--lib/frratomic.h6
-rw-r--r--lib/json.c8
-rw-r--r--lib/json.h2
-rw-r--r--lib/log.c1
-rw-r--r--lib/memory.c22
-rw-r--r--lib/memory.h2
-rw-r--r--lib/memory_vty.c30
-rw-r--r--lib/netns_linux.c13
-rw-r--r--lib/plist.c4
-rw-r--r--lib/plist.h3
-rw-r--r--lib/routemap.c22
-rw-r--r--lib/subdir.am7
-rw-r--r--lib/table.h3
-rw-r--r--lib/zclient.h1
-rw-r--r--ospfd/ospf_bfd.c4
-rw-r--r--ospfd/ospf_bfd.h4
-rw-r--r--ospfd/ospf_vty.c231
-rw-r--r--pimd/pim_bfd.c2
-rw-r--r--pimd/pim_bfd.h2
-rw-r--r--pimd/pim_cmd.c76
-rw-r--r--python/clidef.py2
-rw-r--r--ripngd/ripng_interface.c54
-rw-r--r--ripngd/ripng_route.c42
-rw-r--r--ripngd/ripng_route.h6
-rw-r--r--ripngd/ripng_zebra.c8
-rw-r--r--ripngd/ripngd.c136
-rw-r--r--ripngd/ripngd.h12
-rw-r--r--solaris/.gitignore4
-rw-r--r--solaris/Makefile.in (renamed from solaris/Makefile.am)93
-rw-r--r--solaris/pkginfo.tmpl.in2
-rw-r--r--solaris/subdir.am53
-rw-r--r--staticd/static_nht.c66
-rw-r--r--staticd/static_vrf.c6
-rw-r--r--staticd/static_zebra.c22
-rw-r--r--vtysh/vtysh.h2
-rw-r--r--zebra/if_netlink.c6
-rw-r--r--zebra/interface.c11
-rw-r--r--zebra/interface.h9
-rw-r--r--zebra/zebra_mpls.c4
-rw-r--r--zebra/zebra_mpls.h4
-rw-r--r--zebra/zebra_vty.c45
-rw-r--r--zebra/zebra_vxlan.c37
-rw-r--r--zebra/zebra_vxlan.h36
-rw-r--r--zebra/zserv.c3
135 files changed, 3075 insertions, 2366 deletions
diff --git a/Makefile.am b/Makefile.am
index 3e268f703d..b9003b8358 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -8,6 +8,62 @@ AM_CPPFLAGS += -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/lib \
DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\" -DCONFDATE=$(CONFDATE)
LIBCAP = @LIBCAP@
+# these two targets are provided to easily grab autoconf/Makefile variables
+# you can use either:
+# eval `make VARFD=3 shvar-CFLAGS 3>&1 1>&2`
+# CFLAGS="`make VARFD=3 var-CFLAGS 3>&1 1>&2`"
+# where the former can be used to set several variables at once. Note the
+# fd redirections -- this is to prevent garbage from make rebuilding other
+# targets from causing issues.
+.PHONY: shvar-% var-%
+VARFD ?= 1
+shvar-%:
+ @echo "$*=\"$($*)\"" >&$(VARFD)
+var-%:
+ @echo "$($*)" >&$(VARFD)
+
+# overwriting these vars breaks cross-compilation. let's be helpful and warn.
+#
+# note: "#AUTODERP# " will be removed from Makefile by configure. These are
+# GNU make directives & automake will f*ck them up by trying to process them
+# as automake directives.
+#
+#AUTODERP# null=
+#AUTODERP# SPACE=$(null) $(null)
+#AUTODERP# mkcheck_CC = $(findstring $(SPACE)CC=, $(SPACE)$(MAKEOVERRIDES))
+#AUTODERP# mkcheck_CFLAGS = $(findstring $(SPACE)CFLAGS=, $(SPACE)$(MAKEOVERRIDES))
+#AUTODERP# mkcheck_CPPFLAGS = $(findstring $(SPACE)CPPFLAGS=,$(SPACE)$(MAKEOVERRIDES))
+#AUTODERP# mkcheck_CCLD = $(findstring $(SPACE)CCLD=, $(SPACE)$(MAKEOVERRIDES))
+#AUTODERP# mkcheck_LD = $(findstring $(SPACE)LD=, $(SPACE)$(MAKEOVERRIDES))
+#AUTODERP# mkcheck_LDFLAGS = $(findstring $(SPACE)LDFLAGS=, $(SPACE)$(MAKEOVERRIDES))
+#AUTODERP# #
+#AUTODERP# ifneq ($(mkcheck_CC),)
+#AUTODERP# $(warning WARNING: you have overwritten the "CC" variable on the make command line.)
+#AUTODERP# endif
+#AUTODERP# ifneq ($(mkcheck_CFLAGS),)
+#AUTODERP# $(warning WARNING: you have overwritten the "CFLAGS" variable on the make command line.)
+#AUTODERP# endif
+#AUTODERP# ifneq ($(mkcheck_CPPFLAGS),)
+#AUTODERP# $(warning WARNING: you have overwritten the "CPPFLAGS" variable on the make command line.)
+#AUTODERP# endif
+#AUTODERP# ifneq ($(mkcheck_CCLD),)
+#AUTODERP# $(warning WARNING: you have overwritten the "CCLD" variable on the make command line.)
+#AUTODERP# endif
+#AUTODERP# ifneq ($(mkcheck_LD),)
+#AUTODERP# $(warning WARNING: you have overwritten the "LD" variable on the make command line.)
+#AUTODERP# endif
+#AUTODERP# ifneq ($(mkcheck_LDFLAGS),)
+#AUTODERP# $(warning WARNING: you have overwritten the "LDFLAGS" variable on the make command line.)
+#AUTODERP# endif
+#AUTODERP# #
+#AUTODERP# ifneq ($(mkcheck_CC)$(mkcheck_CFLAGS)$(mkcheck_CPPFLAGS)$(mkcheck_CCLD)$(mkcheck_LD)$(mkcheck_LDFLAGS),)
+#AUTODERP# $(warning ------)
+#AUTODERP# $(warning While overwriting these variables works most of the time, it is not recommended and can cause confusing build errors.)
+#AUTODERP# $(warning This is especially problematic when cross-compiling, since tools that run on the build system during the build process will not be compiled correctly.)
+#AUTODERP# $(warning All of these variables should be supplied to 'configure', and they will be remembered and correctly applied during 'make'.)
+#AUTODERP# $(warning ------)
+#AUTODERP# endif
+
EXTRA_DIST =
BUILT_SOURCES =
CLEANFILES =
@@ -20,11 +76,13 @@ sbin_SCRIPTS =
noinst_PROGRAMS =
noinst_HEADERS =
noinst_LIBRARIES =
+nodist_noinst_DATA =
lib_LTLIBRARIES =
module_LTLIBRARIES =
pkginclude_HEADERS =
nodist_pkginclude_HEADERS =
dist_examples_DATA =
+man_MANS =
## libtool, the self-made GNU scourge
## ... this should fix relinking
@@ -34,6 +92,10 @@ $(AUTOMAKE_DUMMY)install-moduleLTLIBRARIES: install-libLTLIBRARIES
$(AUTOMAKE_DUMMY)install-binPROGRAMS: install-libLTLIBRARIES
$(AUTOMAKE_DUMMY)install-sbinPROGRAMS: install-libLTLIBRARIES
+include doc/subdir.am
+include doc/user/subdir.am
+include doc/manpages/subdir.am
+include doc/developer/subdir.am
include include/subdir.am
include lib/subdir.am
include zebra/subdir.am
@@ -41,6 +103,8 @@ include watchfrr/subdir.am
include qpb/subdir.am
include fpm/subdir.am
include tools/subdir.am
+include debianpkg/subdir.am
+include solaris/subdir.am
include ripd/subdir.am
include ripngd/subdir.am
@@ -60,14 +124,13 @@ include bfdd/subdir.am
SUBDIRS = . @LIBRFP@ @RFPTEST@ \
@BGPD@ \
- @VTYSH@ @DOC@ \
- @SOLARIS@ tests
+ @VTYSH@ \
+ tests
DIST_SUBDIRS = . bgpd \
- vtysh doc tests \
- solaris bgpd/rfp-example/librfp \
+ vtysh tests \
+ bgpd/rfp-example/librfp \
bgpd/rfp-example/rfptest \
- debianpkg \
# end
if PKGSRC
@@ -108,6 +171,11 @@ EXTRA_DIST += \
\
vtysh/Makefile.am \
vtysh/Makefile.in \
+ \
+ doc/Makefile \
+ doc/developer/Makefile \
+ doc/manpages/Makefile \
+ doc/user/Makefile \
# end
ACLOCAL_AMFLAGS = -I m4
diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c
index 47dffd146a..663bc4894a 100644
--- a/bgpd/bgp_bfd.c
+++ b/bgpd/bgp_bfd.c
@@ -530,7 +530,7 @@ void bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer, char *addr)
/*
* bgp_bfd_show_info - Show the peer BFD information.
*/
-void bgp_bfd_show_info(struct vty *vty, struct peer *peer, uint8_t use_json,
+void bgp_bfd_show_info(struct vty *vty, struct peer *peer, bool use_json,
json_object *json_neigh)
{
bfd_show_info(vty, (struct bfd_info *)peer->bfd_info,
diff --git a/bgpd/bgp_bfd.h b/bgpd/bgp_bfd.h
index a3cfca9c0d..caa5651e3a 100644
--- a/bgpd/bgp_bfd.h
+++ b/bgpd/bgp_bfd.h
@@ -34,8 +34,8 @@ extern void bgp_bfd_deregister_peer(struct peer *peer);
extern void bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer,
char *addr);
-extern void bgp_bfd_show_info(struct vty *vty, struct peer *peer,
- uint8_t use_json, json_object *json_neigh);
+extern void bgp_bfd_show_info(struct vty *vty, struct peer *peer, bool use_json,
+ json_object *json_neigh);
extern int bgp_bfd_is_peer_multihop(struct peer *peer);
diff --git a/bgpd/bgp_damp.c b/bgpd/bgp_damp.c
index bce6056ded..071ee6b9c6 100644
--- a/bgpd/bgp_damp.c
+++ b/bgpd/bgp_damp.c
@@ -523,7 +523,7 @@ void bgp_config_write_damp(struct vty *vty)
}
static const char *bgp_get_reuse_time(unsigned int penalty, char *buf,
- size_t len, uint8_t use_json,
+ size_t len, bool use_json,
json_object *json)
{
time_t reuse_time = 0;
@@ -641,7 +641,7 @@ void bgp_damp_info_vty(struct vty *vty, struct bgp_info *binfo,
}
const char *bgp_damp_reuse_time_vty(struct vty *vty, struct bgp_info *binfo,
- char *timebuf, size_t len, uint8_t use_json,
+ char *timebuf, size_t len, bool use_json,
json_object *json)
{
struct bgp_damp_info *bdi;
diff --git a/bgpd/bgp_damp.h b/bgpd/bgp_damp.h
index d3b0ae42aa..8326bae697 100644
--- a/bgpd/bgp_damp.h
+++ b/bgpd/bgp_damp.h
@@ -140,9 +140,10 @@ extern int bgp_damp_decay(time_t, int);
extern void bgp_config_write_damp(struct vty *);
extern void bgp_damp_info_vty(struct vty *, struct bgp_info *,
json_object *json_path);
-extern const char *bgp_damp_reuse_time_vty(struct vty *, struct bgp_info *,
- char *, size_t, uint8_t,
- json_object *);
+extern const char *bgp_damp_reuse_time_vty(struct vty *vty,
+ struct bgp_info *binfo,
+ char *timebuf, size_t len,
+ bool use_json, json_object *json);
extern int bgp_show_dampening_parameters(struct vty *vty, afi_t, safi_t);
#endif /* _QUAGGA_BGP_DAMP_H */
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
index b553cb42a5..a6cc2d9b53 100644
--- a/bgpd/bgp_evpn_vty.c
+++ b/bgpd/bgp_evpn_vty.c
@@ -983,7 +983,7 @@ static void show_vni_entry(struct hash_backet *backet, void *args[])
static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
enum bgp_show_type type, void *output_arg,
- int option, uint8_t use_json)
+ int option, bool use_json)
{
afi_t afi = AFI_L2VPN;
struct bgp *bgp;
@@ -1276,7 +1276,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_routes,
union sockunion su;
struct peer *peer;
int ret;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
argv_find(argv, argc, "A.B.C.D", &idx_ipv4);
@@ -1336,7 +1336,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,
union sockunion su;
struct peer *peer;
struct prefix_rd prd;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
argv_find(argv, argc, "A.B.C.D", &idx_ipv4);
@@ -1409,7 +1409,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_neighbor_advertised_routes,
int ret;
struct peer *peer;
union sockunion su;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
argv_find(argv, argc, "A.B.C.D", &idx_ipv4);
@@ -1467,7 +1467,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,
struct peer *peer;
struct prefix_rd prd;
union sockunion su;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
argv_find(argv, argc, "A.B.C.D", &idx_ipv4);
@@ -3172,7 +3172,7 @@ DEFUN(show_bgp_l2vpn_evpn_vni,
struct bgp *bgp_def;
vni_t vni;
int idx = 0;
- uint8_t uj = 0;
+ bool uj = false;
json_object *json = NULL;
uint32_t num_l2vnis = 0;
uint32_t num_l3vnis = 0;
@@ -3255,7 +3255,7 @@ DEFUN(show_bgp_l2vpn_evpn_es,
JSON_STR)
{
int idx = 0;
- uint8_t uj = 0;
+ bool uj = false;
esi_t esi;
json_object *json = NULL;
struct bgp *bgp = NULL;
@@ -3312,7 +3312,7 @@ DEFUN(show_bgp_l2vpn_evpn_summary,
JSON_STR)
{
int idx_vrf = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
char *vrf = NULL;
if (argv_find(argv, argc, "vrf", &idx_vrf))
@@ -3341,7 +3341,7 @@ DEFUN(show_bgp_l2vpn_evpn_route,
struct bgp *bgp;
int type_idx = 0;
int type = 0;
- uint8_t uj = 0;
+ bool uj = false;
json_object *json = NULL;
uj = use_json(argc, argv);
@@ -3404,7 +3404,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd,
int type = 0;
int rd_idx = 0;
int type_idx = 0;
- int uj = 0;
+ bool uj = false;
json_object *json = NULL;
bgp = bgp_get_default();
@@ -3477,7 +3477,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd_macip,
int rd_idx = 0;
int mac_idx = 0;
int ip_idx = 0;
- int uj = 0;
+ bool uj = false;
json_object *json = NULL;
memset(&mac, 0, sizeof(struct ethaddr));
@@ -3541,7 +3541,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_esi,
"ESI ID\n"
JSON_STR)
{
- int uj = 0;
+ bool uj = false;
esi_t esi;
struct bgp *bgp = NULL;
json_object *json = NULL;
@@ -3597,7 +3597,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_vni, show_bgp_l2vpn_evpn_route_vni_cmd,
struct in_addr vtep_ip;
int type = 0;
int idx = 0;
- int uj = 0;
+ bool uj = false;
json_object *json = NULL;
bgp = bgp_get_default();
@@ -3669,7 +3669,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_vni_macip,
struct ethaddr mac;
struct ipaddr ip;
int idx = 0;
- int uj = 0;
+ bool uj = false;
json_object *json = NULL;
bgp = bgp_get_default();
@@ -3737,7 +3737,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_vni_multicast,
int ret;
struct in_addr orig_ip;
int idx = 0;
- int uj = 0;
+ bool uj = false;
json_object *json = NULL;
bgp = bgp_get_default();
@@ -3793,7 +3793,7 @@ DEFUN(show_bgp_l2vpn_evpn_route_vni_all,
struct bgp *bgp;
struct in_addr vtep_ip;
int idx = 0;
- int uj = 0;
+ bool uj = false;
json_object *json = NULL;
bgp = bgp_get_default();
@@ -3841,7 +3841,7 @@ DEFUN(show_bgp_l2vpn_evpn_vrf_import_rt,
"Show vrf import route target\n"
JSON_STR)
{
- uint8_t uj = 0;
+ bool uj = false;
struct bgp *bgp_def = NULL;
json_object *json = NULL;
@@ -3878,7 +3878,7 @@ DEFUN(show_bgp_l2vpn_evpn_import_rt,
JSON_STR)
{
struct bgp *bgp;
- uint8_t uj = 0;
+ bool uj = false;
json_object *json = NULL;
bgp = bgp_get_default();
@@ -4359,7 +4359,7 @@ DEFUN (show_bgp_vrf_l3vni_info,
json_object *json_vnis = NULL;
json_object *json_export_rts = NULL;
json_object *json_import_rts = NULL;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (uj) {
json = json_object_new_object();
diff --git a/bgpd/bgp_filter.c b/bgpd/bgp_filter.c
index ae9d805b05..c7977a9af4 100644
--- a/bgpd/bgp_filter.c
+++ b/bgpd/bgp_filter.c
@@ -391,16 +391,25 @@ static int as_list_dup_check(struct as_list *aslist, struct as_filter *new)
return 0;
}
-DEFUN (ip_as_path,
- ip_as_path_cmd,
- "ip as-path access-list WORD <deny|permit> LINE...",
- IP_STR
- "BGP autonomous system path filter\n"
- "Specify an access list name\n"
- "Regular expression access list name\n"
- "Specify packets to reject\n"
- "Specify packets to forward\n"
- "A regular-expression to match the BGP AS paths\n")
+static int config_bgp_aspath_validate(const char *regstr)
+{
+ char valid_chars[] = "1234567890_^|[,{}() ]$*+.?-";
+
+ if (strspn(regstr, valid_chars) == strlen(regstr))
+ return 1;
+
+ return 0;
+}
+
+DEFUN(ip_as_path, ip_as_path_cmd,
+ "ip as-path access-list WORD <deny|permit> LINE...",
+ IP_STR
+ "BGP autonomous system path filter\n"
+ "Specify an access list name\n"
+ "Regular expression access list name\n"
+ "Specify packets to reject\n"
+ "Specify packets to forward\n"
+ "A regular-expression (1234567890_(^|[,{}() ]|$)) to match the BGP AS paths\n")
{
int idx = 0;
enum as_filter_type type;
@@ -428,6 +437,12 @@ DEFUN (ip_as_path,
return CMD_WARNING_CONFIG_FAILED;
}
+ if (!config_bgp_aspath_validate(regstr)) {
+ vty_out(vty, "Invalid character in as-path access-list %s\n",
+ regstr);
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
asfilter = as_filter_make(regex, regstr, type);
XFREE(MTYPE_TMP, regstr);
@@ -444,17 +459,15 @@ DEFUN (ip_as_path,
return CMD_SUCCESS;
}
-DEFUN (no_ip_as_path,
- no_ip_as_path_cmd,
- "no ip as-path access-list WORD <deny|permit> LINE...",
- NO_STR
- IP_STR
- "BGP autonomous system path filter\n"
- "Specify an access list name\n"
- "Regular expression access list name\n"
- "Specify packets to reject\n"
- "Specify packets to forward\n"
- "A regular-expression to match the BGP AS paths\n")
+DEFUN(no_ip_as_path, no_ip_as_path_cmd,
+ "no ip as-path access-list WORD <deny|permit> LINE...",
+ NO_STR IP_STR
+ "BGP autonomous system path filter\n"
+ "Specify an access list name\n"
+ "Regular expression access list name\n"
+ "Specify packets to reject\n"
+ "Specify packets to forward\n"
+ "A regular-expression (1234567890_(^|[,{}() ]|$)) to match the BGP AS paths\n")
{
int idx = 0;
enum as_filter_type type;
@@ -488,6 +501,12 @@ DEFUN (no_ip_as_path,
argv_find(argv, argc, "LINE", &idx);
regstr = argv_concat(argv, argc, idx);
+ if (!config_bgp_aspath_validate(regstr)) {
+ vty_out(vty, "Invalid character in as-path access-list %s\n",
+ regstr);
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
regex = bgp_regcomp(regstr);
if (!regex) {
vty_out(vty, "can't compile regexp %s\n", regstr);
diff --git a/bgpd/bgp_keepalives.c b/bgpd/bgp_keepalives.c
index f81836cc83..aeb95f91ba 100644
--- a/bgpd/bgp_keepalives.c
+++ b/bgpd/bgp_keepalives.c
@@ -180,11 +180,7 @@ void *bgp_keepalives_start(void *arg)
pthread_cond_init(peerhash_cond, &attrs);
pthread_condattr_destroy(&attrs);
-#ifdef GNU_LINUX
- pthread_setname_np(fpt->thread, "bgpd_ka");
-#elif defined(OPEN_BSD)
- pthread_set_name_np(fpt->thread, "bgpd_ka");
-#endif
+ frr_pthread_set_name(fpt, NULL, "bgpd_ka");
/* initialize peer hashtable */
peerhash = hash_create_size(2048, peer_hash_key, peer_hash_cmp, NULL);
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index b89edfe459..459775c8ec 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -1775,7 +1775,7 @@ DEFUN (no_vpnv6_network,
int bgp_show_mpls_vpn(struct vty *vty, afi_t afi, struct prefix_rd *prd,
enum bgp_show_type type, void *output_arg, int tags,
- uint8_t use_json)
+ bool use_json)
{
struct bgp *bgp;
struct bgp_table *table;
@@ -1953,7 +1953,7 @@ DEFUN (show_ip_bgp_vpn_all_neighbor_routes,
union sockunion su;
struct peer *peer;
int ret;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
afi_t afi;
int idx = 0;
@@ -2017,7 +2017,7 @@ DEFUN (show_ip_bgp_vpn_rd_neighbor_routes,
union sockunion su;
struct peer *peer;
struct prefix_rd prd;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
afi_t afi;
int idx = 0;
@@ -2095,7 +2095,7 @@ DEFUN (show_ip_bgp_vpn_all_neighbor_advertised_routes,
int ret;
struct peer *peer;
union sockunion su;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
afi_t afi;
int idx = 0;
@@ -2157,7 +2157,7 @@ DEFUN (show_ip_bgp_vpn_rd_neighbor_advertised_routes,
struct peer *peer;
struct prefix_rd prd;
union sockunion su;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
afi_t afi;
int idx = 0;
diff --git a/bgpd/bgp_mplsvpn.h b/bgpd/bgp_mplsvpn.h
index 122ae9e905..61b87392a2 100644
--- a/bgpd/bgp_mplsvpn.h
+++ b/bgpd/bgp_mplsvpn.h
@@ -50,7 +50,7 @@ extern int argv_find_and_parse_vpnvx(struct cmd_token **argv, int argc,
int *index, afi_t *afi);
extern int bgp_show_mpls_vpn(struct vty *vty, afi_t afi, struct prefix_rd *prd,
enum bgp_show_type type, void *output_arg,
- int tags, uint8_t use_json);
+ int tags, bool use_json);
extern void vpn_leak_from_vrf_update(struct bgp *bgp_vpn, struct bgp *bgp_vrf,
struct bgp_info *info_vrf);
diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c
index 7fbc030242..5bdee5f512 100644
--- a/bgpd/bgp_open.c
+++ b/bgpd/bgp_open.c
@@ -52,8 +52,8 @@
Next, if we send capability to the peer we want to set my capabilty
inforation at each peer. */
-void bgp_capability_vty_out(struct vty *vty, struct peer *peer,
- uint8_t use_json, json_object *json_neigh)
+void bgp_capability_vty_out(struct vty *vty, struct peer *peer, bool use_json,
+ json_object *json_neigh)
{
char *pnt;
char *end;
diff --git a/bgpd/bgp_open.h b/bgpd/bgp_open.h
index 42ebe97f2e..0fc321bdf3 100644
--- a/bgpd/bgp_open.h
+++ b/bgpd/bgp_open.h
@@ -86,8 +86,8 @@ struct graceful_restart_af {
extern int bgp_open_option_parse(struct peer *, uint8_t, int *);
extern void bgp_open_capability(struct stream *, struct peer *);
-extern void bgp_capability_vty_out(struct vty *, struct peer *, uint8_t,
- json_object *);
+extern void bgp_capability_vty_out(struct vty *vty, struct peer *peer,
+ bool use_json, json_object *json_neigh);
extern as_t peek_for_as4_capability(struct peer *, uint8_t);
#endif /* _QUAGGA_BGP_OPEN_H */
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 50c484d7de..50ffea27bf 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -6755,7 +6755,7 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
/* called from terminal list command */
void route_vty_out_tmp(struct vty *vty, struct prefix *p, struct attr *attr,
- safi_t safi, uint8_t use_json, json_object *json_ar)
+ safi_t safi, bool use_json, json_object *json_ar)
{
json_object *json_status = NULL;
json_object *json_net = NULL;
@@ -7084,7 +7084,7 @@ void route_vty_out_overlay(struct vty *vty, struct prefix *p,
/* dampening route */
static void damp_route_vty_out(struct vty *vty, struct prefix *p,
struct bgp_info *binfo, int display, safi_t safi,
- uint8_t use_json, json_object *json)
+ bool use_json, json_object *json)
{
struct attr *attr;
int len;
@@ -7147,7 +7147,7 @@ static void damp_route_vty_out(struct vty *vty, struct prefix *p,
/* flap route */
static void flap_route_vty_out(struct vty *vty, struct prefix *p,
struct bgp_info *binfo, int display, safi_t safi,
- uint8_t use_json, json_object *json)
+ bool use_json, json_object *json)
{
struct attr *attr;
struct bgp_damp_info *bdi;
@@ -8160,12 +8160,12 @@ static int bgp_show_regexp(struct vty *vty, struct bgp *bgp, const char *regstr,
afi_t afi, safi_t safi, enum bgp_show_type type);
static int bgp_show_community(struct vty *vty, struct bgp *bgp,
const char *comstr, int exact, afi_t afi,
- safi_t safi, uint8_t use_json);
+ safi_t safi, bool use_json);
static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
struct bgp_table *table, enum bgp_show_type type,
- void *output_arg, uint8_t use_json, char *rd,
+ void *output_arg, bool use_json, char *rd,
int is_last, unsigned long *output_cum,
unsigned long *total_cum,
unsigned long *json_header_depth)
@@ -8452,8 +8452,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
struct bgp_table *table, struct prefix_rd *prd_match,
- enum bgp_show_type type, void *output_arg,
- uint8_t use_json)
+ enum bgp_show_type type, void *output_arg, bool use_json)
{
struct bgp_node *rn, *next;
unsigned long output_cum = 0;
@@ -8493,7 +8492,7 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
return CMD_SUCCESS;
}
static int bgp_show(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
- enum bgp_show_type type, void *output_arg, uint8_t use_json)
+ enum bgp_show_type type, void *output_arg, bool use_json)
{
struct bgp_table *table;
unsigned long json_header_depth = 0;
@@ -8531,16 +8530,18 @@ static int bgp_show(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
}
static void bgp_show_all_instances_routes_vty(struct vty *vty, afi_t afi,
- safi_t safi, uint8_t use_json)
+ safi_t safi, bool use_json)
{
struct listnode *node, *nnode;
struct bgp *bgp;
int is_first = 1;
+ bool route_output = false;
if (use_json)
vty_out(vty, "{\n");
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ route_output = true;
if (use_json) {
if (!is_first)
vty_out(vty, ",\n");
@@ -8563,6 +8564,8 @@ static void bgp_show_all_instances_routes_vty(struct vty *vty, afi_t afi,
if (use_json)
vty_out(vty, "}\n");
+ else if (!route_output)
+ vty_out(vty, "%% BGP instance not found\n");
}
/* Header of detailed BGP route information */
@@ -8748,8 +8751,7 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp,
struct bgp_table *rib, const char *ip_str,
afi_t afi, safi_t safi,
struct prefix_rd *prd, int prefix_check,
- enum bgp_path_type pathtype,
- uint8_t use_json)
+ enum bgp_path_type pathtype, bool use_json)
{
int ret;
int header;
@@ -8885,7 +8887,7 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp,
static int bgp_show_route(struct vty *vty, struct bgp *bgp, const char *ip_str,
afi_t afi, safi_t safi, struct prefix_rd *prd,
int prefix_check, enum bgp_path_type pathtype,
- uint8_t use_json)
+ bool use_json)
{
if (!bgp) {
bgp = bgp_get_default();
@@ -8994,7 +8996,7 @@ DEFUN (show_ip_bgp_large_community_list,
safi = bgp_vty_safi_from_str(argv[idx]->text);
}
- int uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct bgp *bgp = bgp_lookup_by_name(vrf);
if (bgp == NULL) {
@@ -9037,7 +9039,7 @@ DEFUN (show_ip_bgp_large_community,
safi = bgp_vty_safi_from_str(argv[idx]->text);
}
- int uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct bgp *bgp = bgp_lookup_by_name(vrf);
if (bgp == NULL) {
@@ -9121,7 +9123,7 @@ DEFUN (show_ip_bgp,
int idx = 0;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, false);
if (!idx)
return CMD_WARNING;
@@ -9197,16 +9199,16 @@ DEFUN (show_ip_bgp_json,
int idx = 0;
int idx_community_type = 0;
int exact_match = 0;
+ bool uj = use_json(argc, argv);
+
+ if (uj)
+ argc--;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, uj);
if (!idx)
return CMD_WARNING;
- int uj = use_json(argc, argv);
- if (uj)
- argc--;
-
if (argv_find(argv, argc, "cidr-only", &idx))
return bgp_show(vty, bgp, afi, safi, bgp_show_type_cidr_only,
NULL, uj);
@@ -9275,12 +9277,12 @@ DEFUN (show_ip_bgp_route,
char *prefix = NULL;
struct bgp *bgp = NULL;
enum bgp_path_type path_type;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 0;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, uj);
if (!idx)
return CMD_WARNING;
@@ -9343,7 +9345,7 @@ DEFUN (show_ip_bgp_regexp,
int idx = 0;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, false);
if (!idx)
return CMD_WARNING;
@@ -9372,17 +9374,17 @@ DEFUN (show_ip_bgp_instance_all,
afi_t afi = AFI_IP;
safi_t safi = SAFI_UNICAST;
struct bgp *bgp = NULL;
-
int idx = 0;
- bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
- if (!idx)
- return CMD_WARNING;
+ bool uj = use_json(argc, argv);
- int uj = use_json(argc, argv);
if (uj)
argc--;
+ bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
+ &bgp, uj);
+ if (!idx)
+ return CMD_WARNING;
+
bgp_show_all_instances_routes_vty(vty, afi, safi, uj);
return CMD_SUCCESS;
}
@@ -9453,7 +9455,7 @@ static int bgp_show_route_map(struct vty *vty, struct bgp *bgp,
static int bgp_show_community(struct vty *vty, struct bgp *bgp,
const char *comstr, int exact, afi_t afi,
- safi_t safi, uint8_t use_json)
+ safi_t safi, bool use_json)
{
struct community *com;
int ret = 0;
@@ -9512,7 +9514,7 @@ static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp,
}
static struct peer *peer_lookup_in_view(struct vty *vty, struct bgp *bgp,
- const char *ip_str, uint8_t use_json)
+ const char *ip_str, bool use_json)
{
int ret;
struct peer *peer;
@@ -9899,7 +9901,7 @@ static int bgp_peer_count_walker(struct thread *t)
}
static int bgp_peer_counts(struct vty *vty, struct peer *peer, afi_t afi,
- safi_t safi, uint8_t use_json)
+ safi_t safi, bool use_json)
{
struct peer_pcounts pcounts = {.peer = peer};
unsigned int i;
@@ -10009,16 +10011,16 @@ DEFUN (show_ip_bgp_instance_neighbor_prefix_counts,
struct peer *peer;
int idx = 0;
struct bgp *bgp = NULL;
+ bool uj = use_json(argc, argv);
+
+ if (uj)
+ argc--;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, uj);
if (!idx)
return CMD_WARNING;
- int uj = use_json(argc, argv);
- if (uj)
- argc--;
-
argv_find(argv, argc, "neighbors", &idx);
peer = peer_lookup_in_view(vty, bgp, argv[idx + 1]->arg, uj);
if (!peer)
@@ -10045,7 +10047,7 @@ DEFUN (show_ip_bgp_vpn_neighbor_prefix_counts,
{
int idx_peer = 6;
struct peer *peer;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
peer = peer_lookup_in_view(vty, NULL, argv[idx_peer]->arg, uj);
if (!peer)
@@ -10118,7 +10120,7 @@ DEFUN (show_ip_bgp_l2vpn_evpn_all_route_prefix,
static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi,
safi_t safi, enum bgp_show_adj_route_type type,
- const char *rmap_name, uint8_t use_json,
+ const char *rmap_name, bool use_json,
json_object *json)
{
struct bgp_table *table;
@@ -10389,7 +10391,7 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi,
static int peer_adj_routes(struct vty *vty, struct peer *peer, afi_t afi,
safi_t safi, enum bgp_show_adj_route_type type,
- const char *rmap_name, uint8_t use_json)
+ const char *rmap_name, bool use_json)
{
json_object *json = NULL;
@@ -10463,18 +10465,17 @@ DEFUN (show_ip_bgp_instance_neighbor_advertised_route,
struct bgp *bgp = NULL;
struct peer *peer;
enum bgp_show_adj_route_type type = bgp_show_adj_route_advertised;
-
int idx = 0;
- bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
- if (!idx)
- return CMD_WARNING;
-
- int uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (uj)
argc--;
+ bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
+ &bgp, uj);
+ if (!idx)
+ return CMD_WARNING;
+
/* neighbors <A.B.C.D|X:X::X:X|WORD> */
argv_find(argv, argc, "neighbors", &idx);
peerstr = argv[++idx]->arg;
@@ -10536,7 +10537,7 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
argv_find(argv, argc, "neighbors", &idx);
peerstr = argv[++idx]->arg;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
ret = str2sockunion(peerstr, &su);
if (ret < 0) {
@@ -10580,7 +10581,7 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
static int bgp_show_neighbor_route(struct vty *vty, struct peer *peer,
afi_t afi, safi_t safi,
- enum bgp_show_type type, uint8_t use_json)
+ enum bgp_show_type type, bool use_json)
{
/* labeled-unicast routes live in the unicast table */
if (safi == SAFI_LABELED_UNICAST)
@@ -10620,14 +10621,17 @@ DEFUN (show_ip_bgp_flowspec_routes_detailed,
safi_t safi = SAFI_UNICAST;
struct bgp *bgp = NULL;
int idx = 0;
+ bool uj = use_json(argc, argv);
+
+ if (uj)
+ argc--;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, uj);
if (!idx)
return CMD_WARNING;
- return bgp_show(vty, bgp, afi, safi,
- bgp_show_type_detail, NULL, use_json(argc, argv));
+ return bgp_show(vty, bgp, afi, safi, bgp_show_type_detail, NULL, uj);
}
DEFUN (show_ip_bgp_neighbor_routes,
@@ -10655,18 +10659,17 @@ DEFUN (show_ip_bgp_neighbor_routes,
safi_t safi = SAFI_UNICAST;
struct peer *peer;
enum bgp_show_type sh_type = bgp_show_type_neighbor;
-
int idx = 0;
+ bool uj = use_json(argc, argv);
+
+ if (uj)
+ argc--;
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
- &bgp);
+ &bgp, uj);
if (!idx)
return CMD_WARNING;
- int uj = use_json(argc, argv);
- if (uj)
- argc--;
-
/* neighbors <A.B.C.D|X:X::X:X|WORD> */
argv_find(argv, argc, "neighbors", &idx);
peerstr = argv[++idx]->arg;
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index dfef9a8f79..476bb3aa05 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -435,8 +435,9 @@ extern void route_vty_out(struct vty *, struct prefix *, struct bgp_info *, int,
safi_t, json_object *);
extern void route_vty_out_tag(struct vty *, struct prefix *, struct bgp_info *,
int, safi_t, json_object *);
-extern void route_vty_out_tmp(struct vty *, struct prefix *, struct attr *,
- safi_t, uint8_t, json_object *);
+extern void route_vty_out_tmp(struct vty *vty, struct prefix *p,
+ struct attr *attr, safi_t safi, bool use_json,
+ json_object *json_ar);
extern void route_vty_out_overlay(struct vty *vty, struct prefix *p,
struct bgp_info *binfo, int display,
json_object *json);
@@ -484,5 +485,5 @@ extern void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
extern int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
struct bgp_table *table, struct prefix_rd *prd,
enum bgp_show_type type, void *output_arg,
- uint8_t use_json);
+ bool use_json);
#endif /* _QUAGGA_BGP_ROUTE_H */
diff --git a/bgpd/bgp_vpn.c b/bgpd/bgp_vpn.c
index a771eedf0f..2b4477ddde 100644
--- a/bgpd/bgp_vpn.c
+++ b/bgpd/bgp_vpn.c
@@ -32,7 +32,7 @@
int show_adj_route_vpn(struct vty *vty, struct peer *peer,
struct prefix_rd *prd, afi_t afi, safi_t safi,
- uint8_t use_json)
+ bool use_json)
{
struct bgp *bgp;
struct bgp_table *table;
diff --git a/bgpd/bgp_vpn.h b/bgpd/bgp_vpn.h
index 98b4d9f180..a2e86476a2 100644
--- a/bgpd/bgp_vpn.h
+++ b/bgpd/bgp_vpn.h
@@ -25,6 +25,6 @@
extern int show_adj_route_vpn(struct vty *vty, struct peer *peer,
struct prefix_rd *prd, afi_t afi, safi_t safi,
- uint8_t use_json);
+ bool use_json);
#endif /* _QUAGGA_BGP_VPN_H */
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 99c6f39230..3669ea7736 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -301,7 +301,7 @@ int argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index,
int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
struct cmd_token **argv, int argc,
int *idx, afi_t *afi, safi_t *safi,
- struct bgp **bgp)
+ struct bgp **bgp, bool use_json)
{
char *vrf_name = NULL;
@@ -325,9 +325,11 @@ int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
else {
*bgp = bgp_lookup_by_name(vrf_name);
if (!*bgp) {
- vty_out(vty,
- "View/Vrf specified is unknown: %s\n",
- vrf_name);
+ if (use_json)
+ vty_out(vty, "{}\n");
+ else
+ vty_out(vty, "View/Vrf %s is unknown\n",
+ vrf_name);
*idx = 0;
return 0;
}
@@ -335,7 +337,11 @@ int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
} else {
*bgp = bgp_get_default();
if (!*bgp) {
- vty_out(vty, "Unable to find default BGP instance\n");
+ if (use_json)
+ vty_out(vty, "{}\n");
+ else
+ vty_out(vty,
+ "Default BGP instance not found\n");
*idx = 0;
return 0;
}
@@ -7343,7 +7349,7 @@ DEFUN (show_bgp_vrfs,
struct list *inst = bm->bgp;
struct listnode *node;
struct bgp *bgp;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
json_object *json_vrfs = NULL;
int count = 0;
@@ -7672,7 +7678,7 @@ static void bgp_show_bestpath_json(struct bgp *bgp, json_object *json)
/* Show BGP peer's summary information. */
static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
- uint8_t use_json, json_object *json)
+ bool use_json, json_object *json)
{
struct peer *peer;
struct listnode *node, *nnode;
@@ -8089,14 +8095,14 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
}
static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
- int safi, uint8_t use_json,
+ int safi, bool use_json,
json_object *json)
{
int is_first = 1;
int afi_wildcard = (afi == AFI_MAX);
int safi_wildcard = (safi == SAFI_MAX);
int is_wildcard = (afi_wildcard || safi_wildcard);
- bool json_output = false;
+ bool nbr_output = false;
if (use_json && is_wildcard)
vty_out(vty, "{\n");
@@ -8107,7 +8113,7 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
safi = 1; /* SAFI_UNICAST */
while (safi < SAFI_MAX) {
if (bgp_afi_safi_peer_exists(bgp, afi, safi)) {
- json_output = true;
+ nbr_output = true;
if (is_wildcard) {
/*
* So limit output to those afi/safi
@@ -8146,22 +8152,28 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
if (use_json && is_wildcard)
vty_out(vty, "}\n");
- else if (use_json && !json_output)
- vty_out(vty, "{}\n");
+ else if (!nbr_output) {
+ if (use_json)
+ vty_out(vty, "{}\n");
+ else
+ vty_out(vty, "%% No BGP neighbors found\n");
+ }
}
static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
- safi_t safi, uint8_t use_json)
+ safi_t safi, bool use_json)
{
struct listnode *node, *nnode;
struct bgp *bgp;
json_object *json = NULL;
int is_first = 1;
+ bool nbr_output = false;
if (use_json)
vty_out(vty, "{\n");
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ nbr_output = true;
if (use_json) {
json = json_object_new_object();
@@ -8185,10 +8197,12 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
if (use_json)
vty_out(vty, "}\n");
+ else if (!nbr_output)
+ vty_out(vty, "%% BGP instance not found\n");
}
int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
- safi_t safi, uint8_t use_json)
+ safi_t safi, bool use_json)
{
struct bgp *bgp;
@@ -8205,7 +8219,7 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
vty_out(vty, "{}\n");
else
vty_out(vty,
- "%% No such BGP instance exist\n");
+ "%% BGP instance not found\n");
return CMD_WARNING;
}
@@ -8219,6 +8233,13 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
if (bgp)
bgp_show_summary_afi_safi(vty, bgp, afi, safi, use_json, NULL);
+ else {
+ if (use_json)
+ vty_out(vty, "{}\n");
+ else
+ vty_out(vty, "%% BGP instance not found\n");
+ return CMD_WARNING;
+ }
return CMD_SUCCESS;
}
@@ -8258,7 +8279,7 @@ DEFUN (show_ip_bgp_summary,
argv_find_and_parse_safi(argv, argc, &idx, &safi);
}
- int uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
return bgp_show_summary_vty(vty, vrf, afi, safi, uj);
}
@@ -8340,7 +8361,7 @@ static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p,
afi_t afi, safi_t safi,
uint16_t adv_smcap, uint16_t adv_rmcap,
uint16_t rcv_smcap, uint16_t rcv_rmcap,
- uint8_t use_json, json_object *json_pref)
+ bool use_json, json_object *json_pref)
{
/* Send-Mode */
if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
@@ -8400,7 +8421,7 @@ static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p,
}
static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
- safi_t safi, uint8_t use_json,
+ safi_t safi, bool use_json,
json_object *json_neigh)
{
struct bgp_filter *filter;
@@ -8975,7 +8996,7 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
}
}
-static void bgp_show_peer(struct vty *vty, struct peer *p, uint8_t use_json,
+static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
json_object *json)
{
struct bgp *bgp;
@@ -10722,12 +10743,13 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, uint8_t use_json,
static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
enum show_type type, union sockunion *su,
- const char *conf_if, uint8_t use_json,
+ const char *conf_if, bool use_json,
json_object *json)
{
struct listnode *node, *nnode;
struct peer *peer;
int find = 0;
+ bool nbr_output = false;
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
@@ -10736,6 +10758,7 @@ static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
switch (type) {
case show_all:
bgp_show_peer(vty, peer, use_json, json);
+ nbr_output = true;
break;
case show_peer:
if (conf_if) {
@@ -10765,6 +10788,9 @@ static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
vty_out(vty, "%% No such neighbor in this view/vrf\n");
}
+ if (type != show_peer && !nbr_output && !use_json)
+ vty_out(vty, "%% No BGP neighbors found\n");
+
if (use_json) {
vty_out(vty, "%s\n", json_object_to_json_string_ext(
json, JSON_C_TO_STRING_PRETTY));
@@ -10779,18 +10805,20 @@ static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
enum show_type type,
const char *ip_str,
- uint8_t use_json)
+ bool use_json)
{
struct listnode *node, *nnode;
struct bgp *bgp;
union sockunion su;
json_object *json = NULL;
int ret, is_first = 1;
+ bool nbr_output = false;
if (use_json)
vty_out(vty, "{\n");
for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
+ nbr_output = true;
if (use_json) {
if (!(json = json_object_new_object())) {
flog_err(
@@ -10843,11 +10871,13 @@ static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
if (use_json)
vty_out(vty, "}\n");
+ else if (!nbr_output)
+ vty_out(vty, "%% BGP instance not found\n");
}
static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
enum show_type type, const char *ip_str,
- uint8_t use_json)
+ bool use_json)
{
int ret;
struct bgp *bgp;
@@ -10864,8 +10894,6 @@ static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
if (!bgp) {
if (use_json) {
json = json_object_new_object();
- json_object_boolean_true_add(
- json, "bgpNoSuchInstance");
vty_out(vty, "%s\n",
json_object_to_json_string_ext(
json,
@@ -10873,7 +10901,7 @@ static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
json_object_free(json);
} else
vty_out(vty,
- "%% No such BGP instance exist\n");
+ "%% BGP instance not found\n");
return CMD_WARNING;
}
@@ -10897,6 +10925,11 @@ static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
json);
}
json_object_free(json);
+ } else {
+ if (use_json)
+ vty_out(vty, "{}\n");
+ else
+ vty_out(vty, "%% BGP instance not found\n");
}
return CMD_SUCCESS;
@@ -10922,7 +10955,7 @@ DEFUN (show_ip_bgp_neighbors,
char *sh_arg = NULL;
enum show_type sh_type;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 0;
@@ -11037,8 +11070,8 @@ DEFUN (show_ip_bgp_attr_info,
return CMD_SUCCESS;
}
-static int bgp_show_route_leak_vty(struct vty *vty, const char *name,
- afi_t afi, safi_t safi, uint8_t use_json)
+static int bgp_show_route_leak_vty(struct vty *vty, const char *name, afi_t afi,
+ safi_t safi, bool use_json)
{
struct bgp *bgp;
struct listnode *node;
@@ -11054,16 +11087,9 @@ static int bgp_show_route_leak_vty(struct vty *vty, const char *name,
json = json_object_new_object();
- /* Provide context for the block */
- json_object_string_add(json, "vrf", name ? name : "default");
- json_object_string_add(json, "afiSafi",
- afi_safi_print(afi, safi));
-
bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
if (!bgp) {
- json_object_boolean_true_add(json,
- "bgpNoSuchInstance");
vty_out(vty, "%s\n",
json_object_to_json_string_ext(
json,
@@ -11073,6 +11099,11 @@ static int bgp_show_route_leak_vty(struct vty *vty, const char *name,
return CMD_WARNING;
}
+ /* Provide context for the block */
+ json_object_string_add(json, "vrf", name ? name : "default");
+ json_object_string_add(json, "afiSafi",
+ afi_safi_print(afi, safi));
+
if (!CHECK_FLAG(bgp->af_flags[afi][safi],
BGP_CONFIG_VRF_TO_VRF_IMPORT)) {
json_object_string_add(json, "importFromVrfs", "none");
@@ -11211,7 +11242,7 @@ DEFUN (show_ip_bgp_route_leak,
afi_t afi = AFI_MAX;
safi_t safi = SAFI_MAX;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 0;
/* show [ip] bgp */
@@ -11536,7 +11567,7 @@ static int bgp_show_peer_group_vty(struct vty *vty, const char *name,
bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
if (!bgp) {
- vty_out(vty, "%% No such BGP instance exists\n");
+ vty_out(vty, "%% BGP instance not found\n");
return CMD_WARNING;
}
diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h
index afb85f112b..d9df2b4cfe 100644
--- a/bgpd/bgp_vty.h
+++ b/bgpd/bgp_vty.h
@@ -69,9 +69,10 @@ extern int argv_find_and_parse_safi(struct cmd_token **argv, int argc,
extern int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
struct cmd_token **argv,
int argc, int *idx, afi_t *afi,
- safi_t *safi, struct bgp **bgp);
+ safi_t *safi, struct bgp **bgp,
+ bool use_json);
extern int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
- safi_t safi, uint8_t use_json);
+ safi_t safi, bool use_json);
extern void bgp_vpn_policy_config_write_afi(struct vty *vty, struct bgp *bgp,
afi_t afi);
#endif /* _QUAGGA_BGP_VTY_H */
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 5d258a765b..a9707a7fc7 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -6626,7 +6626,7 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi,
}
/* Display peer uptime.*/
-char *peer_uptime(time_t uptime2, char *buf, size_t len, uint8_t use_json,
+char *peer_uptime(time_t uptime2, char *buf, size_t len, bool use_json,
json_object *json)
{
time_t uptime1, epoch_tbuf;
@@ -7765,8 +7765,8 @@ static void bgp_pthreads_init()
.start = bgp_keepalives_start,
.stop = bgp_keepalives_stop,
};
- frr_pthread_new(&io, "BGP I/O thread");
- frr_pthread_new(&ka, "BGP Keepalives thread");
+ frr_pthread_new(&io, "BGP I/O thread", "bgpd_io");
+ frr_pthread_new(&ka, "BGP Keepalives thread", "bgpd_ka");
}
void bgp_pthreads_run()
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 06eb86da95..8a99741390 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -1513,7 +1513,8 @@ extern struct peer *peer_create(union sockunion *, const char *, struct bgp *,
struct peer_group *);
extern struct peer *peer_create_accept(struct bgp *);
extern void peer_xfer_config(struct peer *dst, struct peer *src);
-extern char *peer_uptime(time_t, char *, size_t, uint8_t, json_object *);
+extern char *peer_uptime(time_t uptime2, char *buf, size_t len, bool use_json,
+ json_object *json);
extern int bgp_config_write(struct vty *);
diff --git a/bgpd/rfapi/bgp_rfapi_cfg.c b/bgpd/rfapi/bgp_rfapi_cfg.c
index 8553846c90..f1dd08fda0 100644
--- a/bgpd/rfapi/bgp_rfapi_cfg.c
+++ b/bgpd/rfapi/bgp_rfapi_cfg.c
@@ -23,7 +23,7 @@
#include "lib/prefix.h"
#include "lib/memory.h"
#include "lib/linklist.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/plist.h"
#include "lib/routemap.h"
@@ -126,10 +126,10 @@ struct rfapi_nve_group_cfg *bgp_rfapi_cfg_match_group(struct rfapi_cfg *hc,
struct rfapi_nve_group_cfg *rfg_vn = NULL;
struct rfapi_nve_group_cfg *rfg_un = NULL;
- struct route_table *rt_vn;
- struct route_table *rt_un;
- struct route_node *rn_vn;
- struct route_node *rn_un;
+ struct agg_table *rt_vn;
+ struct agg_table *rt_un;
+ struct agg_node *rn_vn;
+ struct agg_node *rn_un;
struct rfapi_nve_group_cfg *rfg;
struct listnode *node, *nnode;
@@ -156,16 +156,16 @@ struct rfapi_nve_group_cfg *bgp_rfapi_cfg_match_group(struct rfapi_cfg *hc,
return NULL;
}
- rn_vn = route_node_match(rt_vn, vn); /* NB locks node */
+ rn_vn = agg_node_match(rt_vn, vn); /* NB locks node */
if (rn_vn) {
rfg_vn = rn_vn->info;
- route_unlock_node(rn_vn);
+ agg_unlock_node(rn_vn);
}
- rn_un = route_node_match(rt_un, un); /* NB locks node */
+ rn_un = agg_node_match(rt_un, un); /* NB locks node */
if (rn_un) {
rfg_un = rn_un->info;
- route_unlock_node(rn_un);
+ agg_unlock_node(rn_un);
}
#if BGP_VNC_DEBUG_MATCH_GROUP
@@ -2304,11 +2304,11 @@ static void bgp_rfapi_delete_nve_group(struct vty *vty, /* NULL = no output */
if (rfg->vn_node) {
rfg->vn_node->info = NULL;
- route_unlock_node(rfg->vn_node); /* frees */
+ agg_unlock_node(rfg->vn_node); /* frees */
}
if (rfg->un_node) {
rfg->un_node->info = NULL;
- route_unlock_node(rfg->un_node); /* frees */
+ agg_unlock_node(rfg->un_node); /* frees */
}
if (rfg->rfp_cfg)
XFREE(MTYPE_RFAPI_RFP_GROUP_CFG, rfg->rfp_cfg);
@@ -2468,8 +2468,8 @@ DEFUN (vnc_nve_group_prefix,
VTY_DECLVAR_CONTEXT_SUB(rfapi_nve_group_cfg, rfg);
struct prefix p;
afi_t afi;
- struct route_table *rt;
- struct route_node *rn;
+ struct agg_table *rt;
+ struct agg_node *rn;
int is_un_prefix = 0;
/* make sure it's still in list */
@@ -2497,12 +2497,12 @@ DEFUN (vnc_nve_group_prefix,
rt = bgp->rfapi_cfg->nve_groups_vn[afi];
}
- rn = route_node_get(rt, &p); /* NB locks node */
+ rn = agg_node_get(rt, &p); /* NB locks node */
if (rn->info) {
/*
* There is already a group with this prefix
*/
- route_unlock_node(rn);
+ agg_unlock_node(rn);
if (rn->info != rfg) {
/*
* different group name: fail
@@ -2535,7 +2535,7 @@ DEFUN (vnc_nve_group_prefix,
/* detach rfg from previous route table location */
if (rfg->un_node) {
rfg->un_node->info = NULL;
- route_unlock_node(rfg->un_node); /* frees */
+ agg_unlock_node(rfg->un_node); /* frees */
}
rfg->un_node = rn; /* back ref */
rfg->un_prefix = p;
@@ -2545,7 +2545,7 @@ DEFUN (vnc_nve_group_prefix,
/* detach rfg from previous route table location */
if (rfg->vn_node) {
rfg->vn_node->info = NULL;
- route_unlock_node(rfg->vn_node); /* frees */
+ agg_unlock_node(rfg->vn_node); /* frees */
}
rfg->vn_node = rn; /* back ref */
rfg->vn_prefix = p;
@@ -3761,8 +3761,8 @@ struct rfapi_cfg *bgp_rfapi_cfg_new(struct rfapi_rfp_cfg *cfg)
h->nve_groups_sequential = list_new();
assert(h->nve_groups_sequential);
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
- h->nve_groups_vn[afi] = route_table_init();
- h->nve_groups_un[afi] = route_table_init();
+ h->nve_groups_vn[afi] = agg_table_init();
+ h->nve_groups_un[afi] = agg_table_init();
}
h->default_response_lifetime =
BGP_VNC_DEFAULT_RESPONSE_LIFETIME_DEFAULT;
@@ -3820,8 +3820,8 @@ void bgp_rfapi_cfg_destroy(struct bgp *bgp, struct rfapi_cfg *h)
if (h->default_rfp_cfg)
XFREE(MTYPE_RFAPI_RFP_GROUP_CFG, h->default_rfp_cfg);
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
- route_table_finish(h->nve_groups_vn[afi]);
- route_table_finish(h->nve_groups_un[afi]);
+ agg_table_finish(h->nve_groups_vn[afi]);
+ agg_table_finish(h->nve_groups_un[afi]);
}
XFREE(MTYPE_RFAPI_CFG, h);
}
diff --git a/bgpd/rfapi/bgp_rfapi_cfg.h b/bgpd/rfapi/bgp_rfapi_cfg.h
index a11b0992fa..b72d38220b 100644
--- a/bgpd/rfapi/bgp_rfapi_cfg.h
+++ b/bgpd/rfapi/bgp_rfapi_cfg.h
@@ -47,8 +47,8 @@ typedef enum {
} rfapi_group_cfg_type_t;
struct rfapi_nve_group_cfg {
- struct route_node *vn_node; /* backref */
- struct route_node *un_node; /* backref */
+ struct agg_node *vn_node; /* backref */
+ struct agg_node *un_node; /* backref */
rfapi_group_cfg_type_t type; /* NVE|VPN */
char *name; /* unique by type! */
@@ -135,8 +135,8 @@ struct rfapi_cfg {
struct list *l2_groups; /* rfapi_l2_group_cfg list */
/* three views into the same collection of rfapi_nve_group_cfg */
struct list *nve_groups_sequential;
- struct route_table *nve_groups_vn[AFI_MAX];
- struct route_table *nve_groups_un[AFI_MAX];
+ struct agg_table *nve_groups_vn[AFI_MAX];
+ struct agg_table *nve_groups_un[AFI_MAX];
/*
* For Single VRF export to ordinary routing protocols. This is
diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c
index 355cf92053..a0e9ffbbd0 100644
--- a/bgpd/rfapi/rfapi.c
+++ b/bgpd/rfapi/rfapi.c
@@ -23,7 +23,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/routemap.h"
@@ -203,11 +203,11 @@ int rfapi_ip_addr_cmp(struct rfapi_ip_addr *a1, struct rfapi_ip_addr *a2)
static int rfapi_find_node(struct bgp *bgp, struct rfapi_ip_addr *vn_addr,
struct rfapi_ip_addr *un_addr,
- struct route_node **node)
+ struct agg_node **node)
{
struct rfapi *h;
struct prefix p;
- struct route_node *rn;
+ struct agg_node *rn;
int rc;
afi_t afi;
@@ -228,12 +228,12 @@ static int rfapi_find_node(struct bgp *bgp, struct rfapi_ip_addr *vn_addr,
if ((rc = rfapiRaddr2Qprefix(un_addr, &p)))
return rc;
- rn = route_node_lookup(h->un[afi], &p);
+ rn = agg_node_lookup(h->un[afi], &p);
if (!rn)
return ENOENT;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
*node = rn;
@@ -244,7 +244,7 @@ static int rfapi_find_node(struct bgp *bgp, struct rfapi_ip_addr *vn_addr,
int rfapi_find_rfd(struct bgp *bgp, struct rfapi_ip_addr *vn_addr,
struct rfapi_ip_addr *un_addr, struct rfapi_descriptor **rfd)
{
- struct route_node *rn;
+ struct agg_node *rn;
int rc;
rc = rfapi_find_node(bgp, vn_addr, un_addr, &rn);
@@ -1347,8 +1347,8 @@ static int rfapi_open_inner(struct rfapi_descriptor *rfd, struct bgp *bgp,
#define RFD_RTINIT_AFI(rh, ary, afi) \
do { \
if (!ary[afi]) { \
- ary[afi] = route_table_init(); \
- ary[afi]->info = rh; \
+ ary[afi] = agg_table_init(); \
+ agg_set_table_info(ary[afi], rh); \
} \
} while (0)
@@ -1394,7 +1394,7 @@ int rfapi_init_and_open(struct bgp *bgp, struct rfapi_descriptor *rfd,
char buf_un[BUFSIZ];
afi_t afi_vn, afi_un;
struct prefix pfx_un;
- struct route_node *rn;
+ struct agg_node *rn;
rfapi_time(&rfd->open_time);
@@ -1423,7 +1423,7 @@ int rfapi_init_and_open(struct bgp *bgp, struct rfapi_descriptor *rfd,
assert(afi_vn && afi_un);
assert(!rfapiRaddr2Qprefix(&rfd->un_addr, &pfx_un));
- rn = route_node_get(h->un[afi_un], &pfx_un);
+ rn = agg_node_get(h->un[afi_un], &pfx_un);
assert(rn);
rfd->next = rn->info;
rn->info = rfd;
@@ -1535,7 +1535,7 @@ rfapi_query_inner(void *handle, struct rfapi_ip_addr *target,
afi_t afi;
struct prefix p;
struct prefix p_original;
- struct route_node *rn;
+ struct agg_node *rn;
struct rfapi_descriptor *rfd = (struct rfapi_descriptor *)handle;
struct bgp *bgp = rfd->bgp;
struct rfapi_next_hop_entry *pNHE = NULL;
@@ -1704,7 +1704,7 @@ rfapi_query_inner(void *handle, struct rfapi_ip_addr *target,
}
if (rn) {
- route_lock_node(rn); /* so we can unlock below */
+ agg_lock_node(rn); /* so we can unlock below */
} else {
/*
* returns locked node. Don't unlock yet because the
@@ -1721,7 +1721,7 @@ rfapi_query_inner(void *handle, struct rfapi_ip_addr *target,
assert(rn);
if (!rn->info) {
- route_unlock_node(rn);
+ agg_unlock_node(rn);
vnc_zlog_debug_verbose(
"%s: VPN route not found, returning ENOENT", __func__);
return ENOENT;
@@ -1758,7 +1758,7 @@ rfapi_query_inner(void *handle, struct rfapi_ip_addr *target,
&p_original);
}
- route_unlock_node(rn);
+ agg_unlock_node(rn);
done:
if (ppNextHopEntry) {
@@ -2170,7 +2170,7 @@ int rfapi_close(void *handle)
{
struct rfapi_descriptor *rfd = (struct rfapi_descriptor *)handle;
int rc;
- struct route_node *node;
+ struct agg_node *node;
struct bgp *bgp;
struct rfapi *h;
@@ -2276,7 +2276,7 @@ int rfapi_close(void *handle)
}
}
}
- route_unlock_node(node);
+ agg_unlock_node(node);
}
/*
diff --git a/bgpd/rfapi/rfapi_ap.c b/bgpd/rfapi/rfapi_ap.c
index 3112505d4b..691e1e4ec8 100644
--- a/bgpd/rfapi/rfapi_ap.c
+++ b/bgpd/rfapi/rfapi_ap.c
@@ -22,7 +22,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/routemap.h"
diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c
index ac3b6da230..4c506da686 100644
--- a/bgpd/rfapi/rfapi_import.c
+++ b/bgpd/rfapi/rfapi_import.c
@@ -27,7 +27,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/log.h"
@@ -80,7 +80,7 @@
*/
struct rfapi_withdraw {
struct rfapi_import_table *import_table;
- struct route_node *node;
+ struct agg_node *node;
struct bgp_info *info;
safi_t safi; /* used only for bulk operations */
/*
@@ -88,8 +88,8 @@ struct rfapi_withdraw {
* Normally when a timer expires, lockoffset should be 0. However, if
* the timer expiration function is called directly (e.g.,
* rfapiExpireVpnNow), the node could be locked by a preceding
- * route_top() or route_next() in a loop, so we need to pass this
- * value in.
+ * agg_route_top() or agg_route_next() in a loop, so we need to pass
+ * this value in.
*/
int lockoffset;
};
@@ -140,8 +140,8 @@ void rfapiCheckRouteCount()
for (it = h->imports; it; it = it->next) {
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_table *rt;
- struct route_node *rn;
+ struct agg_table *rt;
+ struct agg_node *rn;
int holddown_count = 0;
int local_count = 0;
@@ -150,7 +150,8 @@ void rfapiCheckRouteCount()
rt = it->imported_vpn[afi];
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn;
+ rn = agg_route_next(rn)) {
struct bgp_info *bi;
struct bgp_info *next;
@@ -211,11 +212,11 @@ void rfapiCheckRouteCount()
* Validate reference count for a node in an import table
*
* Normally lockoffset is 0 for nodes in quiescent state. However,
- * route_unlock_node will delete the node if it is called when
+ * agg_unlock_node will delete the node if it is called when
* node->lock == 1, and we have to validate the refcount before
* the node is deleted. In this case, we specify lockoffset 1.
*/
-void rfapiCheckRefcount(struct route_node *rn, safi_t safi, int lockoffset)
+void rfapiCheckRefcount(struct agg_node *rn, safi_t safi, int lockoffset)
{
unsigned int count_bi = 0;
unsigned int count_monitor = 0;
@@ -613,8 +614,8 @@ struct rfapi_import_table *rfapiMacImportTableGet(struct bgp *bgp, uint32_t lni)
it->rt_import_list = enew;
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- it->imported_vpn[afi] = route_table_init();
- it->imported_encap[afi] = route_table_init();
+ it->imported_vpn[afi] = agg_table_init();
+ it->imported_encap[afi] = agg_table_init();
}
it->l2_logical_net_id = lni;
@@ -633,10 +634,10 @@ struct rfapi_import_table *rfapiMacImportTableGet(struct bgp *bgp, uint32_t lni)
* Returns pointer to the list of moved monitors
*/
static struct rfapi_monitor_vpn *
-rfapiMonitorMoveShorter(struct route_node *original_vpn_node, int lockoffset)
+rfapiMonitorMoveShorter(struct agg_node *original_vpn_node, int lockoffset)
{
struct bgp_info *bi;
- struct route_node *par;
+ struct agg_node *par;
struct rfapi_monitor_vpn *m;
struct rfapi_monitor_vpn *mlast;
struct rfapi_monitor_vpn *moved;
@@ -679,7 +680,8 @@ rfapiMonitorMoveShorter(struct route_node *original_vpn_node, int lockoffset)
* one route (even if it is only a withdrawn route) with a
* valid UN address. Call this node "Node P."
*/
- for (par = original_vpn_node->parent; par; par = par->parent) {
+ for (par = agg_node_parent(original_vpn_node); par;
+ par = agg_node_parent(par)) {
for (bi = par->info; bi; bi = bi->next) {
struct prefix pfx;
if (!rfapiGetUnAddrOfVpnBi(bi, &pfx)) {
@@ -699,14 +701,14 @@ rfapiMonitorMoveShorter(struct route_node *original_vpn_node, int lockoffset)
*/
if (!par) {
/* this isn't necessarily 0/0 */
- par = route_top(original_vpn_node->table);
+ par = agg_route_table_top(original_vpn_node);
/*
* If we got the top node but it wasn't 0/0,
* ignore it
*/
if (par && par->p.prefixlen) {
- route_unlock_node(par); /* maybe free */
+ agg_unlock_node(par); /* maybe free */
par = NULL;
}
@@ -725,7 +727,8 @@ rfapiMonitorMoveShorter(struct route_node *original_vpn_node, int lockoffset)
pfx_default.family = original_vpn_node->p.family;
/* creates default node if none exists */
- par = route_node_get(original_vpn_node->table, &pfx_default);
+ par = agg_node_get(agg_get_table(original_vpn_node),
+ &pfx_default);
++parent_already_refcounted;
}
@@ -764,18 +767,18 @@ rfapiMonitorMoveShorter(struct route_node *original_vpn_node, int lockoffset)
RFAPI_CHECK_REFCOUNT(par, SAFI_MPLS_VPN,
parent_already_refcounted - movecount);
while (movecount > parent_already_refcounted) {
- route_lock_node(par);
+ agg_lock_node(par);
++parent_already_refcounted;
}
while (movecount < parent_already_refcounted) {
/* unlikely, but code defensively */
- route_unlock_node(par);
+ agg_unlock_node(par);
--parent_already_refcounted;
}
RFAPI_CHECK_REFCOUNT(original_vpn_node, SAFI_MPLS_VPN,
movecount + lockoffset);
while (movecount--) {
- route_unlock_node(original_vpn_node);
+ agg_unlock_node(original_vpn_node);
}
#if DEBUG_MONITOR_MOVE_SHORTER
@@ -796,12 +799,12 @@ rfapiMonitorMoveShorter(struct route_node *original_vpn_node, int lockoffset)
* Implement MONITOR_MOVE_LONGER(new_node) from
* RFAPI-Import-Event-Handling.txt
*/
-static void rfapiMonitorMoveLonger(struct route_node *new_vpn_node)
+static void rfapiMonitorMoveLonger(struct agg_node *new_vpn_node)
{
struct rfapi_monitor_vpn *monitor;
struct rfapi_monitor_vpn *mlast;
struct bgp_info *bi;
- struct route_node *par;
+ struct agg_node *par;
RFAPI_CHECK_REFCOUNT(new_vpn_node, SAFI_MPLS_VPN, 0);
@@ -824,7 +827,8 @@ static void rfapiMonitorMoveLonger(struct route_node *new_vpn_node)
/*
* Find first parent node that has monitors
*/
- for (par = new_vpn_node->parent; par; par = par->parent) {
+ for (par = agg_node_parent(new_vpn_node); par;
+ par = agg_node_parent(par)) {
if (RFAPI_MONITOR_VPN(par))
break;
}
@@ -860,14 +864,14 @@ static void rfapiMonitorMoveLonger(struct route_node *new_vpn_node)
RFAPI_MONITOR_VPN_W_ALLOC(new_vpn_node) = monitor;
monitor->node = new_vpn_node;
- route_lock_node(new_vpn_node); /* incr refcount */
+ agg_lock_node(new_vpn_node); /* incr refcount */
monitor = mlast ? mlast->next : RFAPI_MONITOR_VPN(par);
RFAPI_CHECK_REFCOUNT(par, SAFI_MPLS_VPN, 1);
/* decr refcount after we're done with par as this might
* free it */
- route_unlock_node(par);
+ agg_unlock_node(par);
continue;
}
@@ -919,10 +923,10 @@ static void rfapiImportTableFlush(struct rfapi_import_table *it)
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_node *rn;
+ struct agg_node *rn;
- for (rn = route_top(it->imported_vpn[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(it->imported_vpn[afi]); rn;
+ rn = agg_route_next(rn)) {
/*
* Each route_node has:
* aggregate: points to rfapi_it_extra with monitor
@@ -936,8 +940,8 @@ static void rfapiImportTableFlush(struct rfapi_import_table *it)
rfapiMonitorExtraFlush(SAFI_MPLS_VPN, rn);
}
- for (rn = route_top(it->imported_encap[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(it->imported_encap[afi]); rn;
+ rn = agg_route_next(rn)) {
/* free bgp_info and its children */
rfapiBgpInfoChainFree(rn->info);
rn->info = NULL;
@@ -945,8 +949,8 @@ static void rfapiImportTableFlush(struct rfapi_import_table *it)
rfapiMonitorExtraFlush(SAFI_ENCAP, rn);
}
- route_table_finish(it->imported_vpn[afi]);
- route_table_finish(it->imported_encap[afi]);
+ agg_table_finish(it->imported_vpn[afi]);
+ agg_table_finish(it->imported_encap[afi]);
}
if (it->monitor_exterior_orphans) {
skiplist_free(it->monitor_exterior_orphans);
@@ -1293,9 +1297,9 @@ int rfapi_extract_l2o(
static struct rfapi_next_hop_entry *
rfapiRouteInfo2NextHopEntry(struct rfapi_ip_prefix *rprefix,
- struct bgp_info *bi, /* route to encode */
- uint32_t lifetime, /* use this in nhe */
- struct route_node *rn) /* req for L2 eth addr */
+ struct bgp_info *bi, /* route to encode */
+ uint32_t lifetime, /* use this in nhe */
+ struct agg_node *rn) /* req for L2 eth addr */
{
struct rfapi_next_hop_entry *new;
int have_vnc_tunnel_un = 0;
@@ -1481,7 +1485,7 @@ rfapiRouteInfo2NextHopEntry(struct rfapi_ip_prefix *rprefix,
return new;
}
-int rfapiHasNonRemovedRoutes(struct route_node *rn)
+int rfapiHasNonRemovedRoutes(struct agg_node *rn)
{
struct bgp_info *bi;
@@ -1501,7 +1505,7 @@ int rfapiHasNonRemovedRoutes(struct route_node *rn)
/*
* DEBUG FUNCTION
*/
-void rfapiDumpNode(struct route_node *rn)
+void rfapiDumpNode(struct agg_node *rn)
{
struct bgp_info *bi;
@@ -1527,14 +1531,14 @@ void rfapiDumpNode(struct route_node *rn)
#endif
static int rfapiNhlAddNodeRoutes(
- struct route_node *rn, /* in */
+ struct agg_node *rn, /* in */
struct rfapi_ip_prefix *rprefix, /* in */
uint32_t lifetime, /* in */
int removed, /* in */
struct rfapi_next_hop_entry **head, /* in/out */
struct rfapi_next_hop_entry **tail, /* in/out */
struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_node *rfd_rib_node, /* preload this NVE rib node */
+ struct agg_node *rfd_rib_node, /* preload this NVE rib node */
struct prefix *pfx_target_original) /* query target */
{
struct bgp_info *bi;
@@ -1544,15 +1548,17 @@ static int rfapiNhlAddNodeRoutes(
int count = 0;
int is_l2 = (rn->p.family == AF_ETHERNET);
- if (rfd_rib_node && rfd_rib_node->table && rfd_rib_node->table->info) {
+ if (rfd_rib_node) {
+ struct agg_table *atable = agg_get_table(rfd_rib_node);
struct rfapi_descriptor *rfd;
- rfd = (struct rfapi_descriptor *)(rfd_rib_node->table->info);
+ if (atable) {
+ rfd = agg_get_table_info(atable);
- if (rfapiRibFTDFilterRecentPrefix(
- rfd, rn, pfx_target_original))
-
- return 0;
+ if (rfapiRibFTDFilterRecentPrefix(rfd, rn,
+ pfx_target_original))
+ return 0;
+ }
}
seen_nexthops =
@@ -1657,13 +1663,13 @@ static int rfapiNhlAddNodeRoutes(
* matches (of course, we still travel down its child subtrees).
*/
static int rfapiNhlAddSubtree(
- struct route_node *rn, /* in */
+ struct agg_node *rn, /* in */
uint32_t lifetime, /* in */
struct rfapi_next_hop_entry **head, /* in/out */
struct rfapi_next_hop_entry **tail, /* in/out */
- struct route_node *omit_node, /* in */
+ struct agg_node *omit_node, /* in */
struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload here */
+ struct agg_table *rfd_rib_table, /* preload here */
struct prefix *pfx_target_original) /* query target */
{
struct rfapi_ip_prefix rprefix;
@@ -1671,65 +1677,67 @@ static int rfapiNhlAddSubtree(
/* FIXME: need to find a better way here to work without sticking our
* hands in node->link */
- if (rn->l_left && rn->l_left != omit_node) {
- if (rn->l_left->info) {
+ if (agg_node_left(rn) && agg_node_left(rn) != omit_node) {
+ if (agg_node_left(rn)->info) {
int count = 0;
- struct route_node *rib_rn = NULL;
+ struct agg_node *rib_rn = NULL;
- rfapiQprefix2Rprefix(&rn->l_left->p, &rprefix);
+ rfapiQprefix2Rprefix(&agg_node_left(rn)->p, &rprefix);
if (rfd_rib_table) {
- rib_rn = route_node_get(rfd_rib_table,
- &rn->l_left->p);
+ rib_rn = agg_node_get(rfd_rib_table,
+ &agg_node_left(rn)->p);
}
count = rfapiNhlAddNodeRoutes(
- rn->l_left, &rprefix, lifetime, 0, head, tail,
- exclude_vnaddr, rib_rn, pfx_target_original);
+ agg_node_left(rn), &rprefix, lifetime, 0, head,
+ tail, exclude_vnaddr, rib_rn,
+ pfx_target_original);
if (!count) {
count = rfapiNhlAddNodeRoutes(
- rn->l_left, &rprefix, lifetime, 1, head,
- tail, exclude_vnaddr, rib_rn,
+ agg_node_left(rn), &rprefix, lifetime,
+ 1, head, tail, exclude_vnaddr, rib_rn,
pfx_target_original);
}
rcount += count;
if (rib_rn)
- route_unlock_node(rib_rn);
+ agg_unlock_node(rib_rn);
}
}
- if (rn->l_right && rn->l_right != omit_node) {
- if (rn->l_right->info) {
+ if (agg_node_right(rn) && agg_node_right(rn) != omit_node) {
+ if (agg_node_right(rn)->info) {
int count = 0;
- struct route_node *rib_rn = NULL;
+ struct agg_node *rib_rn = NULL;
- rfapiQprefix2Rprefix(&rn->l_right->p, &rprefix);
+ rfapiQprefix2Rprefix(&agg_node_right(rn)->p, &rprefix);
if (rfd_rib_table) {
- rib_rn = route_node_get(rfd_rib_table,
- &rn->l_right->p);
+ rib_rn = agg_node_get(rfd_rib_table,
+ &agg_node_right(rn)->p);
}
count = rfapiNhlAddNodeRoutes(
- rn->l_right, &rprefix, lifetime, 0, head, tail,
- exclude_vnaddr, rib_rn, pfx_target_original);
+ agg_node_right(rn), &rprefix, lifetime, 0, head,
+ tail, exclude_vnaddr, rib_rn,
+ pfx_target_original);
if (!count) {
count = rfapiNhlAddNodeRoutes(
- rn->l_right, &rprefix, lifetime, 1,
- head, tail, exclude_vnaddr, rib_rn,
+ agg_node_right(rn), &rprefix, lifetime,
+ 1, head, tail, exclude_vnaddr, rib_rn,
pfx_target_original);
}
rcount += count;
if (rib_rn)
- route_unlock_node(rib_rn);
+ agg_unlock_node(rib_rn);
}
}
- if (rn->l_left) {
+ if (agg_node_left(rn)) {
rcount += rfapiNhlAddSubtree(
- rn->l_left, lifetime, head, tail, omit_node,
+ agg_node_left(rn), lifetime, head, tail, omit_node,
exclude_vnaddr, rfd_rib_table, pfx_target_original);
}
- if (rn->l_right) {
+ if (agg_node_right(rn)) {
rcount += rfapiNhlAddSubtree(
- rn->l_right, lifetime, head, tail, omit_node,
+ agg_node_right(rn), lifetime, head, tail, omit_node,
exclude_vnaddr, rfd_rib_table, pfx_target_original);
}
@@ -1748,17 +1756,17 @@ static int rfapiNhlAddSubtree(
* next less-specific node (i.e., this node's parent) at the end.
*/
struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
- struct route_node *rn, uint32_t lifetime, /* put into nexthop entries */
- struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload here */
- struct prefix *pfx_target_original) /* query target */
+ struct agg_node *rn, uint32_t lifetime, /* put into nexthop entries */
+ struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
+ struct agg_table *rfd_rib_table, /* preload here */
+ struct prefix *pfx_target_original) /* query target */
{
struct rfapi_ip_prefix rprefix;
struct rfapi_next_hop_entry *answer = NULL;
struct rfapi_next_hop_entry *last = NULL;
- struct route_node *parent;
+ struct agg_node *parent;
int count = 0;
- struct route_node *rib_rn;
+ struct agg_node *rib_rn;
#if DEBUG_RETURNED_NHL
{
@@ -1773,7 +1781,7 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
rfapiQprefix2Rprefix(&rn->p, &rprefix);
- rib_rn = rfd_rib_table ? route_node_get(rfd_rib_table, &rn->p) : NULL;
+ rib_rn = rfd_rib_table ? agg_node_get(rfd_rib_table, &rn->p) : NULL;
/*
* Add non-withdrawn routes at this node
@@ -1795,7 +1803,7 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
rfapiPrintNhl(NULL, answer);
#endif
if (rib_rn)
- route_unlock_node(rib_rn);
+ agg_unlock_node(rib_rn);
return answer;
}
@@ -1806,7 +1814,7 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
exclude_vnaddr, rib_rn,
pfx_target_original);
if (rib_rn)
- route_unlock_node(rib_rn);
+ agg_unlock_node(rib_rn);
// rfapiPrintNhl(NULL, answer);
@@ -1814,7 +1822,8 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
* walk up the tree until we find a node with non-deleted
* routes, then add them
*/
- for (parent = rn->parent; parent; parent = parent->parent) {
+ for (parent = agg_node_parent(rn); parent;
+ parent = agg_node_parent(parent)) {
if (rfapiHasNonRemovedRoutes(parent)) {
break;
}
@@ -1824,9 +1833,8 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
* Add non-withdrawn routes from less-specific prefix
*/
if (parent) {
- rib_rn = rfd_rib_table
- ? route_node_get(rfd_rib_table, &parent->p)
- : NULL;
+ rib_rn = rfd_rib_table ? agg_node_get(rfd_rib_table, &parent->p)
+ : NULL;
rfapiQprefix2Rprefix(&parent->p, &rprefix);
count += rfapiNhlAddNodeRoutes(parent, &rprefix, lifetime, 0,
&answer, &last, exclude_vnaddr,
@@ -1835,7 +1843,7 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
rn, exclude_vnaddr, rfd_rib_table,
pfx_target_original);
if (rib_rn)
- route_unlock_node(rib_rn);
+ agg_unlock_node(rib_rn);
} else {
/*
* There is no parent with non-removed routes. Still need to
@@ -1861,19 +1869,18 @@ struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
* Construct nexthop list of all routes in table
*/
struct rfapi_next_hop_entry *rfapiRouteTable2NextHopList(
- struct route_table *rt,
- uint32_t lifetime, /* put into nexthop entries */
- struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload this NVE rib table */
- struct prefix *pfx_target_original) /* query target */
+ struct agg_table *rt, uint32_t lifetime, /* put into nexthop entries */
+ struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
+ struct agg_table *rfd_rib_table, /* preload this NVE rib table */
+ struct prefix *pfx_target_original) /* query target */
{
- struct route_node *rn;
+ struct agg_node *rn;
struct rfapi_next_hop_entry *biglist = NULL;
struct rfapi_next_hop_entry *nhl;
struct rfapi_next_hop_entry *tail = NULL;
int count = 0;
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
nhl = rfapiRouteNode2NextHopList(rn, lifetime, exclude_vnaddr,
rfd_rib_table,
@@ -1898,18 +1905,18 @@ struct rfapi_next_hop_entry *rfapiRouteTable2NextHopList(
}
struct rfapi_next_hop_entry *rfapiEthRouteNode2NextHopList(
- struct route_node *rn, struct rfapi_ip_prefix *rprefix,
+ struct agg_node *rn, struct rfapi_ip_prefix *rprefix,
uint32_t lifetime, /* put into nexthop entries */
struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload NVE rib table */
+ struct agg_table *rfd_rib_table, /* preload NVE rib table */
struct prefix *pfx_target_original) /* query target */
{
int count = 0;
struct rfapi_next_hop_entry *answer = NULL;
struct rfapi_next_hop_entry *last = NULL;
- struct route_node *rib_rn;
+ struct agg_node *rib_rn;
- rib_rn = rfd_rib_table ? route_node_get(rfd_rib_table, &rn->p) : NULL;
+ rib_rn = rfd_rib_table ? agg_node_get(rfd_rib_table, &rn->p) : NULL;
count = rfapiNhlAddNodeRoutes(rn, rprefix, lifetime, 0, &answer, &last,
NULL, rib_rn, pfx_target_original);
@@ -1928,7 +1935,7 @@ struct rfapi_next_hop_entry *rfapiEthRouteNode2NextHopList(
}
if (rib_rn)
- route_unlock_node(rib_rn);
+ agg_unlock_node(rib_rn);
#if DEBUG_RETURNED_NHL
rfapiPrintNhl(NULL, answer);
@@ -1945,13 +1952,13 @@ struct rfapi_next_hop_entry *rfapiEthRouteTable2NextHopList(
uint32_t logical_net_id, struct rfapi_ip_prefix *rprefix,
uint32_t lifetime, /* put into nexthop entries */
struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload NVE rib node */
+ struct agg_table *rfd_rib_table, /* preload NVE rib node */
struct prefix *pfx_target_original) /* query target */
{
struct rfapi_import_table *it;
struct bgp *bgp = bgp_get_default();
- struct route_table *rt;
- struct route_node *rn;
+ struct agg_table *rt;
+ struct agg_node *rn;
struct rfapi_next_hop_entry *biglist = NULL;
struct rfapi_next_hop_entry *nhl;
struct rfapi_next_hop_entry *tail = NULL;
@@ -1961,7 +1968,7 @@ struct rfapi_next_hop_entry *rfapiEthRouteTable2NextHopList(
it = rfapiMacImportTableGet(bgp, logical_net_id);
rt = it->imported_vpn[AFI_L2VPN];
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
nhl = rfapiEthRouteNode2NextHopList(
rn, rprefix, lifetime, exclude_vnaddr, rfd_rib_table,
@@ -1989,7 +1996,7 @@ struct rfapi_next_hop_entry *rfapiEthRouteTable2NextHopList(
* Insert a new bi to the imported route table node,
* keeping the list of BIs sorted best route first
*/
-static void rfapiBgpInfoAttachSorted(struct route_node *rn,
+static void rfapiBgpInfoAttachSorted(struct agg_node *rn,
struct bgp_info *info_new, afi_t afi,
safi_t safi)
{
@@ -2031,7 +2038,7 @@ static void rfapiBgpInfoAttachSorted(struct route_node *rn,
bgp_attr_intern(info_new->attr);
}
-static void rfapiBgpInfoDetach(struct route_node *rn, struct bgp_info *bi)
+static void rfapiBgpInfoDetach(struct agg_node *rn, struct bgp_info *bi)
{
/*
* Remove the route (doubly-linked)
@@ -2127,8 +2134,8 @@ static int rfapi_bi_peer_rd_aux_cmp(void *b1, void *b2)
/*
* Index on RD and Peer
*/
-static void rfapiItBiIndexAdd(struct route_node *rn, /* Import table VPN node */
- struct bgp_info *bi) /* new BI */
+static void rfapiItBiIndexAdd(struct agg_node *rn, /* Import table VPN node */
+ struct bgp_info *bi) /* new BI */
{
struct skiplist *sl;
@@ -2153,15 +2160,15 @@ static void rfapiItBiIndexAdd(struct route_node *rn, /* Import table VPN node */
sl = skiplist_new(0, rfapi_bi_peer_rd_cmp, NULL);
}
RFAPI_IT_EXTRA_GET(rn)->u.vpn.idx_rd = sl;
- route_lock_node(rn); /* for skiplist */
+ agg_lock_node(rn); /* for skiplist */
}
assert(!skiplist_insert(sl, (void *)bi, (void *)bi));
- route_lock_node(rn); /* for skiplist entry */
+ agg_lock_node(rn); /* for skiplist entry */
/* NB: BIs in import tables are not refcounted */
}
-static void rfapiItBiIndexDump(struct route_node *rn)
+static void rfapiItBiIndexDump(struct agg_node *rn)
{
struct skiplist *sl;
void *cursor = NULL;
@@ -2192,7 +2199,7 @@ static void rfapiItBiIndexDump(struct route_node *rn)
}
static struct bgp_info *rfapiItBiIndexSearch(
- struct route_node *rn, /* Import table VPN node */
+ struct agg_node *rn, /* Import table VPN node */
struct prefix_rd *prd, struct peer *peer,
struct prefix *aux_prefix) /* optional L3 addr for L2 ITs */
{
@@ -2298,8 +2305,8 @@ static struct bgp_info *rfapiItBiIndexSearch(
return bi_result;
}
-static void rfapiItBiIndexDel(struct route_node *rn, /* Import table VPN node */
- struct bgp_info *bi) /* old BI */
+static void rfapiItBiIndexDel(struct agg_node *rn, /* Import table VPN node */
+ struct bgp_info *bi) /* old BI */
{
struct skiplist *sl;
int rc;
@@ -2322,7 +2329,7 @@ static void rfapiItBiIndexDel(struct route_node *rn, /* Import table VPN node */
}
assert(!rc);
- route_unlock_node(rn); /* for skiplist entry */
+ agg_unlock_node(rn); /* for skiplist entry */
/* NB: BIs in import tables are not refcounted */
}
@@ -2332,17 +2339,16 @@ static void rfapiItBiIndexDel(struct route_node *rn, /* Import table VPN node */
* refers to it
*/
static void rfapiMonitorEncapAdd(struct rfapi_import_table *import_table,
- struct prefix *p, /* VN address */
- struct route_node *vpn_rn, /* VPN node */
- struct bgp_info *vpn_bi) /* VPN bi/route */
+ struct prefix *p, /* VN address */
+ struct agg_node *vpn_rn, /* VPN node */
+ struct bgp_info *vpn_bi) /* VPN bi/route */
{
afi_t afi = family2afi(p->family);
- struct route_node *rn;
+ struct agg_node *rn;
struct rfapi_monitor_encap *m;
assert(afi);
- rn = route_node_get(import_table->imported_encap[afi],
- p); /* locks rn */
+ rn = agg_node_get(import_table->imported_encap[afi], p); /* locks rn */
assert(rn);
m = XCALLOC(MTYPE_RFAPI_MONITOR_ENCAP,
@@ -2399,7 +2405,7 @@ static void rfapiMonitorEncapDelete(struct bgp_info *vpn_bi)
* freed */
rfapiMonitorExtraPrune(SAFI_ENCAP, hme->rn);
- route_unlock_node(hme->rn); /* decr ref count */
+ agg_unlock_node(hme->rn); /* decr ref count */
XFREE(MTYPE_RFAPI_MONITOR_ENCAP, hme);
vpn_bi->extra->vnc.import.hme = NULL;
}
@@ -2533,7 +2539,7 @@ done:
}
RFAPI_CHECK_REFCOUNT(wcb->node, SAFI_MPLS_VPN, 1 + wcb->lockoffset);
- route_unlock_node(wcb->node); /* decr ref count */
+ agg_unlock_node(wcb->node); /* decr ref count */
XFREE(MTYPE_RFAPI_WITHDRAW, wcb);
return 0;
}
@@ -2660,7 +2666,7 @@ static void rfapiCopyUnEncap2VPN(struct bgp_info *encap_bi,
*/
static int rfapiWithdrawEncapUpdateCachedUn(
struct rfapi_import_table *import_table, struct bgp_info *encap_bi,
- struct route_node *vpn_rn, struct bgp_info *vpn_bi)
+ struct agg_node *vpn_rn, struct bgp_info *vpn_bi)
{
if (!encap_bi) {
@@ -2762,7 +2768,7 @@ static int rfapiWithdrawTimerEncap(struct thread *t)
/*
* for each VPN node referenced in the ENCAP monitors:
*/
- struct route_node *rn;
+ struct agg_node *rn;
while (!skiplist_first(vpn_node_sl, (void **)&rn, NULL)) {
if (!wcb->node->info) {
struct rfapi_monitor_vpn *moved;
@@ -2783,7 +2789,7 @@ static int rfapiWithdrawTimerEncap(struct thread *t)
done:
RFAPI_CHECK_REFCOUNT(wcb->node, SAFI_ENCAP, 1);
- route_unlock_node(wcb->node); /* decr ref count */
+ agg_unlock_node(wcb->node); /* decr ref count */
XFREE(MTYPE_RFAPI_WITHDRAW, wcb);
skiplist_free(vpn_node_sl);
return 0;
@@ -2796,7 +2802,7 @@ done:
*/
static void
rfapiBiStartWithdrawTimer(struct rfapi_import_table *import_table,
- struct route_node *rn, struct bgp_info *bi, afi_t afi,
+ struct agg_node *rn, struct bgp_info *bi, afi_t afi,
safi_t safi,
int (*timer_service_func)(struct thread *))
{
@@ -2886,7 +2892,7 @@ typedef void(rfapi_bi_filtered_import_f)(struct rfapi_import_table *, int,
static void rfapiExpireEncapNow(struct rfapi_import_table *it,
- struct route_node *rn, struct bgp_info *bi)
+ struct agg_node *rn, struct bgp_info *bi)
{
struct rfapi_withdraw *wcb;
struct thread t;
@@ -2939,8 +2945,8 @@ static void rfapiBgpInfoFilteredImportEncap(
uint8_t sub_type, /* part of bgp_info */
uint32_t *label) /* part of bgp_info */
{
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct bgp_info *info_new;
struct bgp_info *bi;
struct bgp_info *next;
@@ -3034,10 +3040,10 @@ static void rfapiBgpInfoFilteredImportEncap(
}
/*
- * route_node_lookup returns a node only if there is at least
+ * agg_node_lookup returns a node only if there is at least
* one route attached.
*/
- rn = route_node_lookup(rt, p);
+ rn = agg_node_lookup(rt, p);
#if DEBUG_ENCAP_MONITOR
vnc_zlog_debug_verbose("%s: initial encap lookup(it=%p) rn=%p",
@@ -3047,7 +3053,7 @@ static void rfapiBgpInfoFilteredImportEncap(
if (rn) {
RFAPI_CHECK_REFCOUNT(rn, SAFI_ENCAP, 1);
- route_unlock_node(rn); /* undo lock in route_node_lookup */
+ agg_unlock_node(rn); /* undo lock in agg_node_lookup */
/*
@@ -3187,9 +3193,9 @@ static void rfapiBgpInfoFilteredImportEncap(
if (rn) {
if (!replacing)
- route_lock_node(rn); /* incr ref count for new BI */
+ agg_lock_node(rn); /* incr ref count for new BI */
} else {
- rn = route_node_get(rt, p);
+ rn = agg_node_get(rt, p);
}
vnc_zlog_debug_verbose(
@@ -3254,7 +3260,7 @@ static void rfapiBgpInfoFilteredImportEncap(
struct rfapi_monitor_encap *m;
struct rfapi_monitor_encap *mnext;
- struct route_node *referenced_vpn_prefix;
+ struct agg_node *referenced_vpn_prefix;
/*
* Optimized approach: build radix tree on the fly to
@@ -3265,9 +3271,9 @@ static void rfapiBgpInfoFilteredImportEncap(
* struct rfapi_monitor_encap, each of which refers to a
* specific VPN node.
*/
- struct route_table *referenced_vpn_table;
+ struct agg_table *referenced_vpn_table;
- referenced_vpn_table = route_table_init();
+ referenced_vpn_table = agg_table_init();
assert(referenced_vpn_table);
/*
@@ -3306,8 +3312,8 @@ static void rfapiBgpInfoFilteredImportEncap(
* per prefix.
*/
- referenced_vpn_prefix = route_node_get(
- referenced_vpn_table, &m->node->p);
+ referenced_vpn_prefix =
+ agg_node_get(referenced_vpn_table, &m->node->p);
assert(referenced_vpn_prefix);
for (mnext = referenced_vpn_prefix->info; mnext;
mnext = mnext->next) {
@@ -3320,7 +3326,7 @@ static void rfapiBgpInfoFilteredImportEncap(
/*
* already have an entry for this VPN node
*/
- route_unlock_node(referenced_vpn_prefix);
+ agg_unlock_node(referenced_vpn_prefix);
} else {
mnext = XCALLOC(
MTYPE_RFAPI_MONITOR_ENCAP,
@@ -3335,16 +3341,18 @@ static void rfapiBgpInfoFilteredImportEncap(
/*
* for each VPN node referenced in the ENCAP monitors:
*/
- for (referenced_vpn_prefix = route_top(referenced_vpn_table);
- referenced_vpn_prefix; referenced_vpn_prefix = route_next(
- referenced_vpn_prefix)) {
+ for (referenced_vpn_prefix =
+ agg_route_top(referenced_vpn_table);
+ referenced_vpn_prefix;
+ referenced_vpn_prefix =
+ agg_route_next(referenced_vpn_prefix)) {
while ((m = referenced_vpn_prefix->info)) {
- struct route_node *n;
+ struct agg_node *n;
rfapiMonitorMoveLonger(m->node);
- for (n = m->node; n; n = n->parent) {
+ for (n = m->node; n; n = agg_node_parent(n)) {
// rfapiDoRouteCallback(import_table, n,
// NULL);
}
@@ -3352,18 +3360,18 @@ static void rfapiBgpInfoFilteredImportEncap(
NULL);
referenced_vpn_prefix->info = m->next;
- route_unlock_node(referenced_vpn_prefix);
+ agg_unlock_node(referenced_vpn_prefix);
XFREE(MTYPE_RFAPI_MONITOR_ENCAP, m);
}
}
- route_table_finish(referenced_vpn_table);
+ agg_table_finish(referenced_vpn_table);
}
RFAPI_CHECK_REFCOUNT(rn, SAFI_ENCAP, 0);
}
static void rfapiExpireVpnNow(struct rfapi_import_table *it,
- struct route_node *rn, struct bgp_info *bi,
+ struct agg_node *rn, struct bgp_info *bi,
int lockoffset)
{
struct rfapi_withdraw *wcb;
@@ -3398,9 +3406,9 @@ void rfapiBgpInfoFilteredImportVPN(
uint8_t sub_type, /* part of bgp_info */
uint32_t *label) /* part of bgp_info */
{
- struct route_table *rt = NULL;
- struct route_node *rn;
- struct route_node *n;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
+ struct agg_node *n;
struct bgp_info *info_new;
struct bgp_info *bi;
struct bgp_info *next;
@@ -3408,7 +3416,7 @@ void rfapiBgpInfoFilteredImportVPN(
struct prefix vn_prefix;
struct prefix un_prefix;
int un_prefix_valid = 0;
- struct route_node *ern;
+ struct agg_node *ern;
int replacing = 0;
int original_had_routes = 0;
struct prefix original_nexthop;
@@ -3494,17 +3502,17 @@ void rfapiBgpInfoFilteredImportVPN(
memset(&original_nexthop, 0, sizeof(original_nexthop));
/*
- * route_node_lookup returns a node only if there is at least
+ * agg_node_lookup returns a node only if there is at least
* one route attached.
*/
- rn = route_node_lookup(rt, p);
+ rn = agg_node_lookup(rt, p);
vnc_zlog_debug_verbose("%s: rn=%p", __func__, rn);
if (rn) {
RFAPI_CHECK_REFCOUNT(rn, SAFI_MPLS_VPN, 1);
- route_unlock_node(rn); /* undo lock in route_node_lookup */
+ agg_unlock_node(rn); /* undo lock in agg_node_lookup */
if (rn->info)
original_had_routes = 1;
@@ -3667,10 +3675,10 @@ void rfapiBgpInfoFilteredImportVPN(
/*
* lookup un address in encap table
*/
- ern = route_node_match(import_table->imported_encap[afi], &vn_prefix);
+ ern = agg_node_match(import_table->imported_encap[afi], &vn_prefix);
if (ern) {
rfapiCopyUnEncap2VPN(ern->info, info_new);
- route_unlock_node(ern); /* undo lock in route_note_match */
+ agg_unlock_node(ern); /* undo lock in route_note_match */
} else {
char buf[PREFIX_STRLEN];
@@ -3683,13 +3691,13 @@ void rfapiBgpInfoFilteredImportVPN(
if (rn) {
if (!replacing)
- route_lock_node(rn);
+ agg_lock_node(rn);
} else {
/*
* No need to increment reference count, so only "get"
* if the node is not there already
*/
- rn = route_node_get(rt, p);
+ rn = agg_node_get(rt, p);
}
/*
@@ -3856,7 +3864,7 @@ void rfapiBgpInfoFilteredImportVPN(
}
if (!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE)) {
- for (n = rn; n; n = n->parent) {
+ for (n = rn; n; n = agg_node_parent(n)) {
// rfapiDoRouteCallback(import_table, n, NULL);
}
rfapiMonitorItNodeChanged(import_table, rn, NULL);
@@ -4108,9 +4116,9 @@ static void rfapiProcessPeerDownRt(struct peer *peer,
struct rfapi_import_table *import_table,
afi_t afi, safi_t safi)
{
- struct route_node *rn;
+ struct agg_node *rn;
struct bgp_info *bi;
- struct route_table *rt;
+ struct agg_table *rt;
int (*timer_service_func)(struct thread *);
assert(afi == AFI_IP || afi == AFI_IP6);
@@ -4131,7 +4139,7 @@ static void rfapiProcessPeerDownRt(struct peer *peer,
}
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
for (bi = rn->info; bi; bi = bi->next) {
if (bi->peer == peer) {
@@ -4274,7 +4282,7 @@ struct rfapi *bgp_rfapi_new(struct bgp *bgp)
h = (struct rfapi *)XCALLOC(MTYPE_RFAPI, sizeof(struct rfapi));
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
- h->un[afi] = route_table_init();
+ h->un[afi] = agg_table_init();
}
/*
@@ -4282,10 +4290,10 @@ struct rfapi *bgp_rfapi_new(struct bgp *bgp)
*/
h->it_ce = XCALLOC(MTYPE_RFAPI_IMPORTTABLE,
sizeof(struct rfapi_import_table));
- h->it_ce->imported_vpn[AFI_IP] = route_table_init();
- h->it_ce->imported_vpn[AFI_IP6] = route_table_init();
- h->it_ce->imported_encap[AFI_IP] = route_table_init();
- h->it_ce->imported_encap[AFI_IP6] = route_table_init();
+ h->it_ce->imported_vpn[AFI_IP] = agg_table_init();
+ h->it_ce->imported_vpn[AFI_IP6] = agg_table_init();
+ h->it_ce->imported_encap[AFI_IP] = agg_table_init();
+ h->it_ce->imported_encap[AFI_IP6] = agg_table_init();
rfapiBgpTableFilteredImport(bgp, h->it_ce, AFI_IP, SAFI_MPLS_VPN);
rfapiBgpTableFilteredImport(bgp, h->it_ce, AFI_IP6, SAFI_MPLS_VPN);
@@ -4317,10 +4325,10 @@ void bgp_rfapi_destroy(struct bgp *bgp, struct rfapi *h)
h->resolve_nve_nexthop = NULL;
}
- route_table_finish(h->it_ce->imported_vpn[AFI_IP]);
- route_table_finish(h->it_ce->imported_vpn[AFI_IP6]);
- route_table_finish(h->it_ce->imported_encap[AFI_IP]);
- route_table_finish(h->it_ce->imported_encap[AFI_IP6]);
+ agg_table_finish(h->it_ce->imported_vpn[AFI_IP]);
+ agg_table_finish(h->it_ce->imported_vpn[AFI_IP6]);
+ agg_table_finish(h->it_ce->imported_encap[AFI_IP]);
+ agg_table_finish(h->it_ce->imported_encap[AFI_IP6]);
if (h->import_mac) {
struct rfapi_import_table *it;
@@ -4346,7 +4354,7 @@ void bgp_rfapi_destroy(struct bgp *bgp, struct rfapi *h)
rfp_stop(h->rfp);
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
- route_table_finish(h->un[afi]);
+ agg_table_finish(h->un[afi]);
}
XFREE(MTYPE_RFAPI_IMPORTTABLE, h->it_ce);
@@ -4394,8 +4402,8 @@ rfapiImportTableRefAdd(struct bgp *bgp, struct ecommunity *rt_import_list,
*/
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- it->imported_vpn[afi] = route_table_init();
- it->imported_encap[afi] = route_table_init();
+ it->imported_vpn[afi] = agg_table_init();
+ it->imported_encap[afi] = agg_table_init();
rfapiBgpTableFilteredImport(bgp, it, afi,
SAFI_MPLS_VPN);
@@ -4452,8 +4460,8 @@ static void rfapiDeleteRemotePrefixesIt(
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_table *rt;
- struct route_node *rn;
+ struct agg_table *rt;
+ struct agg_node *rn;
if (p && (family2afi(p->family) != afi)) {
continue;
@@ -4466,7 +4474,7 @@ static void rfapiDeleteRemotePrefixesIt(
vnc_zlog_debug_verbose("%s: scanning rt for afi=%d", __func__,
afi);
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
struct bgp_info *bi;
struct bgp_info *next;
diff --git a/bgpd/rfapi/rfapi_import.h b/bgpd/rfapi/rfapi_import.h
index 84b7ca3a76..ae3d248367 100644
--- a/bgpd/rfapi/rfapi_import.h
+++ b/bgpd/rfapi/rfapi_import.h
@@ -40,10 +40,10 @@ struct rfapi_import_table {
struct ecommunity *rt_import_list; /* copied from nve grp */
int refcount; /* nve grps and nves */
uint32_t l2_logical_net_id; /* L2 only: EVPN Eth Seg Id */
- struct route_table *imported_vpn[AFI_MAX];
+ struct agg_table *imported_vpn[AFI_MAX];
struct rfapi_monitor_vpn *vpn0_queries[AFI_MAX];
struct rfapi_monitor_eth *eth0_queries;
- struct route_table *imported_encap[AFI_MAX];
+ struct agg_table *imported_encap[AFI_MAX];
struct skiplist *monitor_exterior_orphans;
int local_count[AFI_MAX];
int remote_count[AFI_MAX];
@@ -80,7 +80,7 @@ extern void rfapiCheckRouteCount(void);
extern void rfapiPrintBi(void *stream, struct bgp_info *bi);
extern void rfapiShowImportTable(void *stream, const char *label,
- struct route_table *rt, int isvpn);
+ struct agg_table *rt, int isvpn);
extern struct rfapi_import_table *
rfapiImportTableRefAdd(struct bgp *bgp, struct ecommunity *rt_import_list,
@@ -100,32 +100,31 @@ extern void rfapiImportTableRefDelByIt(struct bgp *bgp,
* next less-specific node (i.e., this node's parent) at the end.
*/
extern struct rfapi_next_hop_entry *rfapiRouteNode2NextHopList(
- struct route_node *rn, uint32_t lifetime, /* put into nexthop entries */
- struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload this NVE rib table */
- struct prefix *pfx_target_original); /* query target */
+ struct agg_node *rn, uint32_t lifetime, /* put into nexthop entries */
+ struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
+ struct agg_table *rfd_rib_table, /* preload this NVE rib table */
+ struct prefix *pfx_target_original); /* query target */
extern struct rfapi_next_hop_entry *rfapiRouteTable2NextHopList(
- struct route_table *rt,
- uint32_t lifetime, /* put into nexthop entries */
- struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rfd_rib_table, /* preload this NVE rib table */
- struct prefix *pfx_target_original); /* query target */
+ struct agg_table *rt, uint32_t lifetime, /* put into nexthop entries */
+ struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
+ struct agg_table *rfd_rib_table, /* preload this NVE rib table */
+ struct prefix *pfx_target_original); /* query target */
extern struct rfapi_next_hop_entry *rfapiEthRouteTable2NextHopList(
uint32_t logical_net_id, struct rfapi_ip_prefix *rprefix,
uint32_t lifetime, /* put into nexthop entries */
struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rib_route_table, /* preload NVE rib node */
+ struct agg_table *rib_route_table, /* preload NVE rib node */
struct prefix *pfx_target_original); /* query target */
extern int rfapiEcommunitiesIntersect(struct ecommunity *e1,
struct ecommunity *e2);
-extern void rfapiCheckRefcount(struct route_node *rn, safi_t safi,
+extern void rfapiCheckRefcount(struct agg_node *rn, safi_t safi,
int lockoffset);
-extern int rfapiHasNonRemovedRoutes(struct route_node *rn);
+extern int rfapiHasNonRemovedRoutes(struct agg_node *rn);
extern int rfapiProcessDeferredClose(struct thread *t);
@@ -153,10 +152,10 @@ extern void rfapiBgpInfoFilteredImportVPN(
uint32_t *label); /* part of bgp_info */
extern struct rfapi_next_hop_entry *rfapiEthRouteNode2NextHopList(
- struct route_node *rn, struct rfapi_ip_prefix *rprefix,
+ struct agg_node *rn, struct rfapi_ip_prefix *rprefix,
uint32_t lifetime, /* put into nexthop entries */
struct rfapi_ip_addr *exclude_vnaddr, /* omit routes to same NVE */
- struct route_table *rib_route_table, /* preload NVE rib table */
+ struct agg_table *rib_route_table, /* preload NVE rib table */
struct prefix *pfx_target_original); /* query target */
extern struct rfapi_import_table *rfapiMacImportTableGetNoAlloc(struct bgp *bgp,
diff --git a/bgpd/rfapi/rfapi_monitor.c b/bgpd/rfapi/rfapi_monitor.c
index 30182ba7a6..59387240fa 100644
--- a/bgpd/rfapi/rfapi_monitor.c
+++ b/bgpd/rfapi/rfapi_monitor.c
@@ -28,7 +28,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/log.h"
@@ -68,10 +68,10 @@ static void rfapiMonitorEthDetachImport(struct bgp *bgp,
/*
* Debug function, special case
*/
-void rfapiMonitorEthSlCheck(struct route_node *rn, const char *tag1,
+void rfapiMonitorEthSlCheck(struct agg_node *rn, const char *tag1,
const char *tag2)
{
- struct route_node *rn_saved = NULL;
+ struct agg_node *rn_saved = NULL;
static struct skiplist *sl_saved = NULL;
struct skiplist *sl;
@@ -118,12 +118,13 @@ void rfapiMonitorDupCheck(struct bgp *bgp)
struct rfapi_descriptor *rfd;
for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, hnode, rfd)) {
- struct route_node *mrn;
+ struct agg_node *mrn;
if (!rfd->mon)
continue;
- for (mrn = route_top(rfd->mon); mrn; mrn = route_next(mrn)) {
+ for (mrn = agg_route_top(rfd->mon); mrn;
+ mrn = agg_route_next(mrn)) {
struct rfapi_monitor_vpn *m;
for (m = (struct rfapi_monitor_vpn *)(mrn->info); m;
m = m->next)
@@ -132,12 +133,13 @@ void rfapiMonitorDupCheck(struct bgp *bgp)
}
for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, hnode, rfd)) {
- struct route_node *mrn;
+ struct agg_node *mrn;
if (!rfd->mon)
continue;
- for (mrn = route_top(rfd->mon); mrn; mrn = route_next(mrn)) {
+ for (mrn = agg_route_top(rfd->mon); mrn;
+ mrn = agg_route_next(mrn)) {
struct rfapi_monitor_vpn *m;
for (m = (struct rfapi_monitor_vpn *)(mrn->info); m;
@@ -158,15 +160,17 @@ void rfapiMonitorCleanCheck(struct bgp *bgp)
assert(!rfd->import_table->vpn0_queries[AFI_IP]);
assert(!rfd->import_table->vpn0_queries[AFI_IP6]);
- struct route_node *rn;
+ struct agg_node *rn;
- for (rn = route_top(rfd->import_table->imported_vpn[AFI_IP]);
- rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(
+ rfd->import_table->imported_vpn[AFI_IP]);
+ rn; rn = agg_route_next(rn)) {
assert(!RFAPI_MONITOR_VPN(rn));
}
- for (rn = route_top(rfd->import_table->imported_vpn[AFI_IP6]);
- rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(
+ rfd->import_table->imported_vpn[AFI_IP6]);
+ rn; rn = agg_route_next(rn)) {
assert(!RFAPI_MONITOR_VPN(rn));
}
@@ -180,7 +184,7 @@ void rfapiMonitorCheckAttachAllowed(void)
assert(!(bgp->rfapi_cfg->flags & BGP_VNC_CONFIG_CALLBACK_DISABLE));
}
-void rfapiMonitorExtraFlush(safi_t safi, struct route_node *rn)
+void rfapiMonitorExtraFlush(safi_t safi, struct agg_node *rn)
{
struct rfapi_it_extra *hie;
struct rfapi_monitor_vpn *v;
@@ -202,7 +206,7 @@ void rfapiMonitorExtraFlush(safi_t safi, struct route_node *rn)
e_next = e->next;
e->next = NULL;
XFREE(MTYPE_RFAPI_MONITOR_ENCAP, e);
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
hie->u.encap.e = NULL;
break;
@@ -212,33 +216,33 @@ void rfapiMonitorExtraFlush(safi_t safi, struct route_node *rn)
v_next = v->next;
v->next = NULL;
XFREE(MTYPE_RFAPI_MONITOR, e);
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
hie->u.vpn.v = NULL;
if (hie->u.vpn.e.source) {
while (!skiplist_delete_first(hie->u.vpn.e.source)) {
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
skiplist_free(hie->u.vpn.e.source);
hie->u.vpn.e.source = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
if (hie->u.vpn.idx_rd) {
/* looping through bi->extra->vnc.import.rd is tbd */
while (!skiplist_delete_first(hie->u.vpn.idx_rd)) {
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
skiplist_free(hie->u.vpn.idx_rd);
hie->u.vpn.idx_rd = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
if (hie->u.vpn.mon_eth) {
while (!skiplist_delete_first(hie->u.vpn.mon_eth)) {
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
skiplist_free(hie->u.vpn.mon_eth);
hie->u.vpn.mon_eth = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
break;
@@ -247,13 +251,13 @@ void rfapiMonitorExtraFlush(safi_t safi, struct route_node *rn)
}
XFREE(MTYPE_RFAPI_IT_EXTRA, hie);
rn->aggregate = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
/*
* If the child lists are empty, release the rfapi_it_extra struct
*/
-void rfapiMonitorExtraPrune(safi_t safi, struct route_node *rn)
+void rfapiMonitorExtraPrune(safi_t safi, struct agg_node *rn)
{
struct rfapi_it_extra *hie;
@@ -279,28 +283,28 @@ void rfapiMonitorExtraPrune(safi_t safi, struct route_node *rn)
return;
skiplist_free(hie->u.vpn.mon_eth);
hie->u.vpn.mon_eth = NULL;
- route_unlock_node(rn); /* uncount skiplist */
+ agg_unlock_node(rn); /* uncount skiplist */
}
if (hie->u.vpn.e.source) {
if (skiplist_count(hie->u.vpn.e.source))
return;
skiplist_free(hie->u.vpn.e.source);
hie->u.vpn.e.source = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
if (hie->u.vpn.idx_rd) {
if (skiplist_count(hie->u.vpn.idx_rd))
return;
skiplist_free(hie->u.vpn.idx_rd);
hie->u.vpn.idx_rd = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
if (hie->u.vpn.mon_eth) {
if (skiplist_count(hie->u.vpn.mon_eth))
return;
skiplist_free(hie->u.vpn.mon_eth);
hie->u.vpn.mon_eth = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
break;
@@ -309,17 +313,17 @@ void rfapiMonitorExtraPrune(safi_t safi, struct route_node *rn)
}
XFREE(MTYPE_RFAPI_IT_EXTRA, hie);
rn->aggregate = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
/*
* returns locked node
*/
-struct route_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
- struct prefix *p)
+struct agg_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
+ struct prefix *p)
{
afi_t afi;
- struct route_node *rn;
+ struct agg_node *rn;
if (RFAPI_0_PREFIX(p)) {
assert(1);
@@ -341,7 +345,7 @@ struct route_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
* if a monitor is moved to another node, there must be
* corresponding unlock/locks
*/
- for (rn = route_node_match(rfd->import_table->imported_vpn[afi], p);
+ for (rn = agg_node_match(rfd->import_table->imported_vpn[afi], p);
rn;) {
struct bgp_info *bi;
@@ -369,9 +373,9 @@ struct route_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
if (bi)
break;
- route_unlock_node(rn);
- if ((rn = rn->parent)) {
- route_lock_node(rn);
+ agg_unlock_node(rn);
+ if ((rn = agg_node_parent(rn))) {
+ agg_lock_node(rn);
}
}
@@ -383,8 +387,8 @@ struct route_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
/* creates default node if none exists, and increments ref count
*/
- rn = route_node_get(rfd->import_table->imported_vpn[afi],
- &pfx_default);
+ rn = agg_node_get(rfd->import_table->imported_vpn[afi],
+ &pfx_default);
}
return rn;
@@ -396,10 +400,10 @@ struct route_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
* returned (for the benefit of caller which might like to use it
* to generate an immediate query response).
*/
-static struct route_node *rfapiMonitorAttachImport(struct rfapi_descriptor *rfd,
- struct rfapi_monitor_vpn *m)
+static struct agg_node *rfapiMonitorAttachImport(struct rfapi_descriptor *rfd,
+ struct rfapi_monitor_vpn *m)
{
- struct route_node *rn;
+ struct agg_node *rn;
rfapiMonitorCheckAttachAllowed();
@@ -438,7 +442,7 @@ static struct route_node *rfapiMonitorAttachImport(struct rfapi_descriptor *rfd,
*/
void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd)
{
- struct route_node *mrn;
+ struct agg_node *mrn;
if (!rfd->mon) {
/*
@@ -447,7 +451,7 @@ void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd)
return;
}
- for (mrn = route_top(rfd->mon); mrn; mrn = route_next(mrn)) {
+ for (mrn = agg_route_top(rfd->mon); mrn; mrn = agg_route_next(mrn)) {
if (!mrn->info)
continue;
@@ -467,11 +471,11 @@ void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd)
* are disabled, this function will not perform a lookup, and the
* caller will have to do its own lookup.
*/
-struct route_node *
-rfapiMonitorAdd(struct bgp *bgp, struct rfapi_descriptor *rfd, struct prefix *p)
+struct agg_node *rfapiMonitorAdd(struct bgp *bgp, struct rfapi_descriptor *rfd,
+ struct prefix *p)
{
struct rfapi_monitor_vpn *m;
- struct route_node *rn;
+ struct agg_node *rn;
/*
* Initialize nve's monitor list if needed
@@ -480,15 +484,15 @@ rfapiMonitorAdd(struct bgp *bgp, struct rfapi_descriptor *rfd, struct prefix *p)
* or be 0/0 so they won't get mixed up.
*/
if (!rfd->mon) {
- rfd->mon = route_table_init();
+ rfd->mon = agg_table_init();
}
- rn = route_node_get(rfd->mon, p);
+ rn = agg_node_get(rfd->mon, p);
if (rn->info) {
/*
* received this query before, no further action needed
*/
rfapiMonitorTimerRestart((struct rfapi_monitor_vpn *)rn->info);
- route_unlock_node(rn);
+ agg_unlock_node(rn);
return NULL;
}
@@ -575,7 +579,7 @@ rfapiMonitorDetachImport(struct rfapi_monitor_vpn *m)
this->next;
}
RFAPI_CHECK_REFCOUNT(m->node, SAFI_MPLS_VPN, 1);
- route_unlock_node(m->node);
+ agg_unlock_node(m->node);
}
m->node = NULL;
}
@@ -586,12 +590,12 @@ rfapiMonitorDetachImport(struct rfapi_monitor_vpn *m)
void rfapiMonitorDetachImportHd(struct rfapi_descriptor *rfd)
{
- struct route_node *rn;
+ struct agg_node *rn;
if (!rfd->mon)
return;
- for (rn = route_top(rfd->mon); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->mon); rn; rn = agg_route_next(rn)) {
if (rn->info) {
rfapiMonitorDetachImport(
(struct rfapi_monitor_vpn *)(rn->info));
@@ -602,11 +606,11 @@ void rfapiMonitorDetachImportHd(struct rfapi_descriptor *rfd)
void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd,
struct prefix *p)
{
- struct route_node *rn;
+ struct agg_node *rn;
struct rfapi_monitor_vpn *m;
assert(rfd->mon);
- rn = route_node_get(rfd->mon, p); /* locks node */
+ rn = agg_node_get(rfd->mon, p); /* locks node */
m = rn->info;
assert(m);
@@ -628,8 +632,8 @@ void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd,
*/
XFREE(MTYPE_RFAPI_MONITOR, m);
rn->info = NULL;
- route_unlock_node(rn); /* undo original lock when created */
- route_unlock_node(rn); /* undo lock in route_node_get */
+ agg_unlock_node(rn); /* undo original lock when created */
+ agg_unlock_node(rn); /* undo lock in agg_node_get */
--rfd->monitor_count;
--bgp->rfapi->monitor_count;
@@ -640,7 +644,7 @@ void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd,
*/
int rfapiMonitorDelHd(struct rfapi_descriptor *rfd)
{
- struct route_node *rn;
+ struct agg_node *rn;
struct bgp *bgp;
int count = 0;
@@ -649,7 +653,8 @@ int rfapiMonitorDelHd(struct rfapi_descriptor *rfd)
bgp = bgp_get_default();
if (rfd->mon) {
- for (rn = route_top(rfd->mon); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->mon); rn;
+ rn = agg_route_next(rn)) {
struct rfapi_monitor_vpn *m;
if ((m = rn->info)) {
if (!(bgp->rfapi_cfg->flags
@@ -664,14 +669,14 @@ int rfapiMonitorDelHd(struct rfapi_descriptor *rfd)
XFREE(MTYPE_RFAPI_MONITOR, m);
rn->info = NULL;
- route_unlock_node(rn); /* undo original lock
+ agg_unlock_node(rn); /* undo original lock
when created */
++count;
--rfd->monitor_count;
--bgp->rfapi->monitor_count;
}
}
- route_table_finish(rfd->mon);
+ agg_table_finish(rfd->mon);
rfd->mon = NULL;
}
@@ -788,7 +793,7 @@ static void rfapiMonitorTimerRestart(struct rfapi_monitor_vpn *m)
*/
void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd, struct prefix *p)
{
- struct route_node *rn;
+ struct agg_node *rn;
if (AF_ETHERNET == p->family) {
struct rfapi_monitor_eth *mon_eth;
@@ -812,7 +817,8 @@ void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd, struct prefix *p)
}
} else {
- for (rn = route_top(rfd->mon); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->mon); rn;
+ rn = agg_route_next(rn)) {
struct rfapi_monitor_vpn *m;
if (!((m = rn->info)))
@@ -831,11 +837,11 @@ void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd, struct prefix *p)
* rfapiRibUpdatePendingNode with this node and all corresponding NVEs.
*/
void rfapiMonitorItNodeChanged(
- struct rfapi_import_table *import_table, struct route_node *it_node,
+ struct rfapi_import_table *import_table, struct agg_node *it_node,
struct rfapi_monitor_vpn *monitor_list) /* for base it node, NULL=all */
{
struct skiplist *nves_seen;
- struct route_node *rn = it_node;
+ struct agg_node *rn = it_node;
struct bgp *bgp = bgp_get_default();
afi_t afi = family2afi(rn->p.family);
#if DEBUG_L2_EXTRA
@@ -909,7 +915,8 @@ void rfapiMonitorItNodeChanged(
* to them
* because we haven't sent them an initial route.
*/
- if (!rn->parent && !rn->info && it_node->parent)
+ if (!agg_node_parent(rn) && !rn->info
+ && it_node->parent)
break;
for (; m; m = m->next) {
@@ -947,7 +954,7 @@ void rfapiMonitorItNodeChanged(
m->rfd->response_lifetime);
}
}
- rn = rn->parent;
+ rn = agg_node_parent(rn);
if (rn)
m = RFAPI_MONITOR_VPN(rn);
} while (rn);
@@ -1023,8 +1030,7 @@ void rfapiMonitorItNodeChanged(
* omit old node and its subtree
*/
void rfapiMonitorMovedUp(struct rfapi_import_table *import_table,
- struct route_node *old_node,
- struct route_node *new_node,
+ struct agg_node *old_node, struct agg_node *new_node,
struct rfapi_monitor_vpn *monitor_list)
{
struct bgp *bgp = bgp_get_default();
@@ -1125,7 +1131,7 @@ static int mon_eth_cmp(void *a, void *b)
static void rfapiMonitorEthAttachImport(
struct rfapi_import_table *it,
- struct route_node *rn, /* it node attach point if non-0 */
+ struct agg_node *rn, /* it node attach point if non-0 */
struct rfapi_monitor_eth *mon) /* monitor struct to attach */
{
struct skiplist *sl;
@@ -1162,7 +1168,7 @@ static void rfapiMonitorEthAttachImport(
if (!sl) {
sl = RFAPI_MONITOR_ETH_W_ALLOC(rn) =
skiplist_new(0, NULL, NULL);
- route_lock_node(rn); /* count skiplist mon_eth */
+ agg_lock_node(rn); /* count skiplist mon_eth */
}
#if DEBUG_L2_EXTRA
@@ -1175,7 +1181,7 @@ static void rfapiMonitorEthAttachImport(
assert(!rc);
/* count eth monitor */
- route_lock_node(rn);
+ agg_lock_node(rn);
}
/*
@@ -1202,7 +1208,7 @@ static void rfapiMonitorEthAttachImportHd(struct bgp *bgp,
struct rfapi_import_table *it;
struct prefix pfx_mac_buf;
- struct route_node *rn;
+ struct agg_node *rn;
it = rfapiMacImportTableGet(bgp, mon->logical_net_id);
assert(it);
@@ -1212,7 +1218,7 @@ static void rfapiMonitorEthAttachImportHd(struct bgp *bgp,
pfx_mac_buf.prefixlen = 48;
pfx_mac_buf.u.prefix_eth = mon->macaddr;
- rn = route_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf);
+ rn = agg_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf);
assert(rn);
(void)rfapiMonitorEthAttachImport(it, rn, mon);
@@ -1226,7 +1232,7 @@ static void rfapiMonitorEthDetachImport(
struct rfapi_import_table *it;
struct prefix pfx_mac_buf;
struct skiplist *sl;
- struct route_node *rn;
+ struct agg_node *rn;
int rc;
it = rfapiMacImportTableGet(bgp, mon->logical_net_id);
@@ -1262,7 +1268,7 @@ static void rfapiMonitorEthDetachImport(
pfx_mac_buf.prefixlen = 48;
pfx_mac_buf.u.prefix_eth = mon->macaddr;
- rn = route_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf);
+ rn = agg_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf);
assert(rn);
#if DEBUG_L2_EXTRA
@@ -1288,19 +1294,19 @@ static void rfapiMonitorEthDetachImport(
assert(!rc);
/* uncount eth monitor */
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
-struct route_node *rfapiMonitorEthAdd(struct bgp *bgp,
- struct rfapi_descriptor *rfd,
- struct ethaddr *macaddr,
- uint32_t logical_net_id)
+struct agg_node *rfapiMonitorEthAdd(struct bgp *bgp,
+ struct rfapi_descriptor *rfd,
+ struct ethaddr *macaddr,
+ uint32_t logical_net_id)
{
int rc;
struct rfapi_monitor_eth mon_buf;
struct rfapi_monitor_eth *val;
struct rfapi_import_table *it;
- struct route_node *rn = NULL;
+ struct agg_node *rn = NULL;
struct prefix pfx_mac_buf;
if (!rfd->mon_eth) {
@@ -1323,7 +1329,7 @@ struct route_node *rfapiMonitorEthAdd(struct bgp *bgp,
pfx_mac_buf.u.prefix_eth = *macaddr;
if (!RFAPI_0_ETHERADDR(macaddr)) {
- rn = route_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf);
+ rn = agg_node_get(it->imported_vpn[AFI_L2VPN], &pfx_mac_buf);
assert(rn);
}
@@ -1453,8 +1459,8 @@ void rfapiMonitorCallbacksOff(struct bgp *bgp)
{
struct rfapi_import_table *it;
afi_t afi;
- struct route_table *rt;
- struct route_node *rn;
+ struct agg_table *rt;
+ struct agg_node *rn;
void *cursor;
int rc;
struct rfapi *h = bgp->rfapi;
@@ -1485,7 +1491,8 @@ void rfapiMonitorCallbacksOff(struct bgp *bgp)
rt = it->imported_vpn[afi];
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn;
+ rn = agg_route_next(rn)) {
m = RFAPI_MONITOR_VPN(rn);
if (RFAPI_MONITOR_VPN(rn))
RFAPI_MONITOR_VPN_W_ALLOC(rn) = NULL;
@@ -1494,7 +1501,7 @@ void rfapiMonitorCallbacksOff(struct bgp *bgp)
m->next =
NULL; /* gratuitous safeness */
m->node = NULL;
- route_unlock_node(rn); /* uncount */
+ agg_unlock_node(rn); /* uncount */
}
}
@@ -1531,12 +1538,12 @@ void rfapiMonitorCallbacksOff(struct bgp *bgp)
* Find non-0 monitors (i.e., actual addresses, not FTD
* monitors)
*/
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
struct skiplist *sl;
sl = RFAPI_MONITOR_ETH(rn);
while (!skiplist_delete_first(sl)) {
- route_unlock_node(rn); /* uncount monitor */
+ agg_unlock_node(rn); /* uncount monitor */
}
}
diff --git a/bgpd/rfapi/rfapi_monitor.h b/bgpd/rfapi/rfapi_monitor.h
index edc9744cdb..9b85f6248e 100644
--- a/bgpd/rfapi/rfapi_monitor.h
+++ b/bgpd/rfapi/rfapi_monitor.h
@@ -30,10 +30,10 @@
* to indicate which nves are interested in a prefix/target
*/
struct rfapi_monitor_vpn {
- struct rfapi_monitor_vpn *next; /* chain from struct route_node */
+ struct rfapi_monitor_vpn *next; /* chain from struct agg_node */
struct rfapi_descriptor *rfd; /* which NVE requested the route */
struct prefix p; /* constant: pfx in original request */
- struct route_node *node; /* node we're currently attached to */
+ struct agg_node *node; /* node we're currently attached to */
uint32_t flags;
#define RFAPI_MON_FLAG_NEEDCALLBACK 0x00000001 /* deferred callback */
@@ -44,9 +44,9 @@ struct rfapi_monitor_vpn {
struct rfapi_monitor_encap {
struct rfapi_monitor_encap *next;
struct rfapi_monitor_encap *prev;
- struct route_node *node; /* VPN node */
+ struct agg_node *node; /* VPN node */
struct bgp_info *bi; /* VPN bi */
- struct route_node *rn; /* parent node */
+ struct agg_node *rn; /* parent node */
};
struct rfapi_monitor_eth {
@@ -98,7 +98,7 @@ struct rfapi_it_extra {
((struct rfapi_it_extra \
*)((rn)->aggregate \
? (rn)->aggregate \
- : (route_lock_node(rn), \
+ : (agg_lock_node(rn), \
(rn)->aggregate = XCALLOC( \
MTYPE_RFAPI_IT_EXTRA, \
sizeof(struct rfapi_it_extra)))))
@@ -138,16 +138,16 @@ extern void rfapiMonitorCleanCheck(struct bgp *bgp);
extern void rfapiMonitorCheckAttachAllowed(void);
-extern void rfapiMonitorExtraFlush(safi_t safi, struct route_node *rn);
+extern void rfapiMonitorExtraFlush(safi_t safi, struct agg_node *rn);
-extern struct route_node *
-rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd, struct prefix *p);
+extern struct agg_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
+ struct prefix *p);
extern void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd);
-extern struct route_node *rfapiMonitorAdd(struct bgp *bgp,
- struct rfapi_descriptor *rfd,
- struct prefix *p);
+extern struct agg_node *rfapiMonitorAdd(struct bgp *bgp,
+ struct rfapi_descriptor *rfd,
+ struct prefix *p);
extern void rfapiMonitorDetachImportHd(struct rfapi_descriptor *rfd);
@@ -164,24 +164,24 @@ extern void rfapiMonitorResponseRemovalOff(struct bgp *bgp);
extern void rfapiMonitorResponseRemovalOn(struct bgp *bgp);
-extern void rfapiMonitorExtraPrune(safi_t safi, struct route_node *rn);
+extern void rfapiMonitorExtraPrune(safi_t safi, struct agg_node *rn);
extern void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd,
struct prefix *p);
extern void rfapiMonitorItNodeChanged(struct rfapi_import_table *import_table,
- struct route_node *it_node,
+ struct agg_node *it_node,
struct rfapi_monitor_vpn *monitor_list);
extern void rfapiMonitorMovedUp(struct rfapi_import_table *import_table,
- struct route_node *old_node,
- struct route_node *new_node,
+ struct agg_node *old_node,
+ struct agg_node *new_node,
struct rfapi_monitor_vpn *monitor_list);
-extern struct route_node *rfapiMonitorEthAdd(struct bgp *bgp,
- struct rfapi_descriptor *rfd,
- struct ethaddr *macaddr,
- uint32_t logical_net_id);
+extern struct agg_node *rfapiMonitorEthAdd(struct bgp *bgp,
+ struct rfapi_descriptor *rfd,
+ struct ethaddr *macaddr,
+ uint32_t logical_net_id);
extern void rfapiMonitorEthDel(struct bgp *bgp, struct rfapi_descriptor *rfd,
struct ethaddr *macaddr,
diff --git a/bgpd/rfapi/rfapi_nve_addr.c b/bgpd/rfapi/rfapi_nve_addr.c
index 0fb887912c..ee54d88c3f 100644
--- a/bgpd/rfapi/rfapi_nve_addr.c
+++ b/bgpd/rfapi/rfapi_nve_addr.c
@@ -21,7 +21,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/skiplist.h"
diff --git a/bgpd/rfapi/rfapi_private.h b/bgpd/rfapi/rfapi_private.h
index 9c759fc47e..4d8072a49b 100644
--- a/bgpd/rfapi/rfapi_private.h
+++ b/bgpd/rfapi/rfapi_private.h
@@ -47,7 +47,7 @@ struct rfapi_advertised_prefixes {
};
struct rfapi_descriptor {
- struct route_node *un_node; /* backref to un table */
+ struct agg_node *un_node; /* backref to un table */
struct rfapi_descriptor *next; /* next vn_addr */
@@ -76,7 +76,7 @@ struct rfapi_descriptor {
struct rfapi_import_table *import_table;
uint32_t monitor_count;
- struct route_table *mon; /* rfapi_monitors */
+ struct agg_table *mon; /* rfapi_monitors */
struct skiplist *mon_eth; /* ethernet monitors */
/*
@@ -85,10 +85,10 @@ struct rfapi_descriptor {
* rsp_times last time we sent response containing pfx
*/
uint32_t rib_prefix_count; /* pfxes with routes */
- struct route_table *rib[AFI_MAX];
- struct route_table *rib_pending[AFI_MAX];
+ struct agg_table *rib[AFI_MAX];
+ struct agg_table *rib_pending[AFI_MAX];
struct work_queue *updated_responses_queue;
- struct route_table *rsp_times[AFI_MAX];
+ struct agg_table *rsp_times[AFI_MAX];
uint32_t rsp_counter; /* dedup initial rsp */
time_t rsp_time; /* dedup initial rsp */
@@ -171,7 +171,7 @@ struct rfapi_global_stats {
* check vn address to get exact match.
*/
struct rfapi {
- struct route_table *un[AFI_MAX];
+ struct agg_table *un[AFI_MAX];
struct rfapi_import_table *imports; /* IPv4, IPv6 */
struct list descriptors; /* debug & resolve-nve imports */
@@ -198,8 +198,8 @@ struct rfapi {
* bgp unicast or zebra, we need to keep track of information
* related to expiring the routes according to the VNC lifetime
*/
- struct route_table *rt_export_bgp[AFI_MAX];
- struct route_table *rt_export_zebra[AFI_MAX];
+ struct agg_table *rt_export_bgp[AFI_MAX];
+ struct agg_table *rt_export_zebra[AFI_MAX];
/*
* For VNC->BGP unicast exports in CE mode, we need a
diff --git a/bgpd/rfapi/rfapi_rib.c b/bgpd/rfapi/rfapi_rib.c
index 60534fece0..3ac217ff89 100644
--- a/bgpd/rfapi/rfapi_rib.c
+++ b/bgpd/rfapi/rfapi_rib.c
@@ -27,7 +27,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/log.h"
@@ -150,10 +150,10 @@ void rfapiRibCheckCounts(
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_node *rn;
+ struct agg_node *rn;
- for (rn = route_top(rfd->rib[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->rib[afi]); rn;
+ rn = agg_route_next(rn)) {
struct skiplist *sl = rn->info;
struct skiplist *dsl = rn->aggregate;
@@ -175,8 +175,8 @@ void rfapiRibCheckCounts(
++t_pfx_deleted;
}
}
- for (rn = route_top(rfd->rib_pending[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->rib_pending[afi]); rn;
+ rn = agg_route_next(rn)) {
struct list *l = rn->info; /* sorted by cost */
struct skiplist *sl = rn->aggregate;
@@ -286,7 +286,7 @@ struct rfapi_rib_tcb {
struct rfapi_descriptor *rfd;
struct skiplist *sl;
struct rfapi_info *ri;
- struct route_node *rn;
+ struct agg_node *rn;
int flags;
#define RFAPI_RIB_TCB_FLAG_DELETED 0x00000001
};
@@ -325,7 +325,7 @@ static int rfapiRibExpireTimer(struct thread *t)
RFAPI_RIB_PREFIX_COUNT_DECR(tcb->rfd, bgp->rfapi);
}
skiplist_free(tcb->sl);
- route_unlock_node(tcb->rn);
+ agg_unlock_node(tcb->rn);
}
XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb);
@@ -335,10 +335,10 @@ static int rfapiRibExpireTimer(struct thread *t)
return 0;
}
-static void
-rfapiRibStartTimer(struct rfapi_descriptor *rfd, struct rfapi_info *ri,
- struct route_node *rn, /* route node attached to */
- int deleted)
+static void rfapiRibStartTimer(struct rfapi_descriptor *rfd,
+ struct rfapi_info *ri,
+ struct agg_node *rn, /* route node attached to */
+ int deleted)
{
struct thread *t = ri->timer;
struct rfapi_rib_tcb *tcb = NULL;
@@ -486,12 +486,12 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
#endif
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_node *pn;
- struct route_node *rn;
+ struct agg_node *pn;
+ struct agg_node *rn;
if (rfd->rib_pending[afi]) {
- for (pn = route_top(rfd->rib_pending[afi]); pn;
- pn = route_next(pn)) {
+ for (pn = agg_route_top(rfd->rib_pending[afi]); pn;
+ pn = agg_route_next(pn)) {
if (pn->aggregate) {
/*
* free references into the rfapi_info
@@ -502,7 +502,7 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
(struct skiplist
*)(pn->aggregate));
pn->aggregate = NULL;
- route_unlock_node(
+ agg_unlock_node(
pn); /* skiplist deleted */
}
/*
@@ -516,13 +516,13 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
}
pn->info = NULL;
/* linklist or 1 deleted */
- route_unlock_node(pn);
+ agg_unlock_node(pn);
}
}
}
if (rfd->rib[afi]) {
- for (rn = route_top(rfd->rib[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->rib[afi]); rn;
+ rn = agg_route_next(rn)) {
if (rn->info) {
struct rfapi_info *ri;
@@ -541,7 +541,7 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
skiplist_free(
(struct skiplist *)rn->info);
rn->info = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
RFAPI_RIB_PREFIX_COUNT_DECR(rfd,
bgp->rfapi);
}
@@ -566,7 +566,7 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
*)(rn->aggregate));
rn->aggregate = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
}
}
@@ -601,15 +601,18 @@ void rfapiRibFree(struct rfapi_descriptor *rfd)
* Free radix trees
*/
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- route_table_finish(rfd->rib_pending[afi]);
+ if (rfd->rib_pending[afi])
+ agg_table_finish(rfd->rib_pending[afi]);
rfd->rib_pending[afi] = NULL;
- route_table_finish(rfd->rib[afi]);
+ if (rfd->rib[afi])
+ agg_table_finish(rfd->rib[afi]);
rfd->rib[afi] = NULL;
- /* NB route_table_finish frees only prefix nodes, not chained
+ /* NB agg_table_finish frees only prefix nodes, not chained
* info */
- route_table_finish(rfd->rsp_times[afi]);
+ if (rfd->rsp_times[afi])
+ agg_table_finish(rfd->rsp_times[afi]);
rfd->rib[afi] = NULL;
}
}
@@ -730,7 +733,7 @@ static void rfapiRibBi2Ri(struct bgp_info *bi, struct rfapi_info *ri,
* !0 do not include route in response
*/
int rfapiRibPreloadBi(
- struct route_node *rfd_rib_node, /* NULL = don't preload or filter */
+ struct agg_node *rfd_rib_node, /* NULL = don't preload or filter */
struct prefix *pfx_vn, struct prefix *pfx_un, uint32_t lifetime,
struct bgp_info *bi)
{
@@ -738,7 +741,7 @@ int rfapiRibPreloadBi(
struct skiplist *slRibPt = NULL;
struct rfapi_info *ori = NULL;
struct rfapi_rib_key rk;
- struct route_node *trn;
+ struct agg_node *trn;
afi_t afi;
if (!rfd_rib_node)
@@ -746,7 +749,7 @@ int rfapiRibPreloadBi(
afi = family2afi(rfd_rib_node->p.family);
- rfd = (struct rfapi_descriptor *)(rfd_rib_node->table->info);
+ rfd = agg_get_table_info(agg_get_table(rfd_rib_node));
memset((void *)&rk, 0, sizeof(rk));
rk.vn = *pfx_vn;
@@ -784,7 +787,7 @@ int rfapiRibPreloadBi(
if (!slRibPt) {
slRibPt = skiplist_new(0, rfapi_rib_key_cmp, NULL);
rfd_rib_node->info = slRibPt;
- route_lock_node(rfd_rib_node);
+ agg_lock_node(rfd_rib_node);
RFAPI_RIB_PREFIX_COUNT_INCR(rfd, rfd->bgp->rfapi);
}
skiplist_insert(slRibPt, &ori->rk, ori);
@@ -802,11 +805,11 @@ int rfapiRibPreloadBi(
/*
* Update last sent time for prefix
*/
- trn = route_node_get(rfd->rsp_times[afi],
- &rfd_rib_node->p); /* locks trn */
+ trn = agg_node_get(rfd->rsp_times[afi],
+ &rfd_rib_node->p); /* locks trn */
trn->info = (void *)(uintptr_t)bgp_clock();
if (trn->lock > 1)
- route_unlock_node(trn);
+ agg_unlock_node(trn);
return 0;
}
@@ -837,7 +840,7 @@ int rfapiRibPreloadBi(
*/
static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd,
afi_t afi,
- struct route_node *pn, /* pending node */
+ struct agg_node *pn, /* pending node */
struct rfapi_next_hop_entry **head,
struct rfapi_next_hop_entry **tail)
{
@@ -845,7 +848,7 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd,
struct listnode *nnode = NULL;
struct rfapi_info *ri = NULL; /* happy valgrind */
struct rfapi_ip_prefix hp = {0}; /* pfx to put in NHE */
- struct route_node *rn = NULL;
+ struct agg_node *rn = NULL;
struct skiplist *slRibPt = NULL; /* rib list */
struct skiplist *slPendPt = NULL;
struct list *lPendCost = NULL;
@@ -875,7 +878,7 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd,
/*
* Find corresponding RIB node
*/
- rn = route_node_get(rfd->rib[afi], &pn->p); /* locks rn */
+ rn = agg_node_get(rfd->rib[afi], &pn->p); /* locks rn */
/*
* RIB skiplist has key=rfapi_addr={vn,un}, val = rfapi_info,
@@ -945,30 +948,30 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd,
skiplist_free(slRibPt);
rn->info = slRibPt = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
lPendCost = pn->info = NULL;
- route_unlock_node(pn);
+ agg_unlock_node(pn);
goto callback;
}
if (slRibPt) {
skiplist_free(slRibPt);
rn->info = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
assert(!slPendPt);
if (slPendPt) { /* TBD I think we can toss this block */
skiplist_free(slPendPt);
pn->aggregate = NULL;
- route_unlock_node(pn);
+ agg_unlock_node(pn);
}
pn->info = NULL;
- route_unlock_node(pn);
+ agg_unlock_node(pn);
- route_unlock_node(rn); /* route_node_get() */
+ agg_unlock_node(rn); /* agg_node_get() */
if (rib_node_started_nonempty) {
RFAPI_RIB_PREFIX_COUNT_DECR(rfd, bgp->rfapi);
@@ -1076,7 +1079,7 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd,
if (skiplist_empty(slRibPt)) {
skiplist_free(slRibPt);
slRibPt = rn->info = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
}
}
@@ -1142,7 +1145,7 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd,
slRibPt = skiplist_new(
0, rfapi_rib_key_cmp, NULL);
rn->info = slRibPt;
- route_lock_node(rn);
+ agg_lock_node(rn);
}
skiplist_insert(slRibPt, &ori->rk, ori);
@@ -1192,7 +1195,7 @@ callback:
for (ALL_LIST_ELEMENTS(lPendCost, node, nnode, ri)) {
struct rfapi_next_hop_entry *new;
- struct route_node *trn;
+ struct agg_node *trn;
new = XCALLOC(MTYPE_RFAPI_NEXTHOP,
sizeof(struct rfapi_next_hop_entry));
@@ -1244,11 +1247,11 @@ callback:
/*
* update this NVE's timestamp for this prefix
*/
- trn = route_node_get(rfd->rsp_times[afi],
- &pn->p); /* locks trn */
+ trn = agg_node_get(rfd->rsp_times[afi],
+ &pn->p); /* locks trn */
trn->info = (void *)(uintptr_t)bgp_clock();
if (trn->lock > 1)
- route_unlock_node(trn);
+ agg_unlock_node(trn);
rfapiRfapiIpAddr2Str(&new->vn_address, buf, BUFSIZ);
rfapiRfapiIpAddr2Str(&new->un_address, buf2, BUFSIZ);
@@ -1347,7 +1350,7 @@ callback:
0, rfapi_rib_key_cmp,
(void (*)(void *))
rfapi_info_free);
- route_lock_node(rn);
+ agg_lock_node(rn);
}
RFAPI_RIB_CHECK_COUNTS(0, delete_list->count);
@@ -1438,18 +1441,18 @@ callback:
RFAPI_RIB_CHECK_COUNTS(0, 0);
/*
- * Reset pending lists. The final route_unlock_node() will probably
+ * Reset pending lists. The final agg_unlock_node() will probably
* cause the pending node to be released.
*/
if (slPendPt) {
skiplist_free(slPendPt);
pn->aggregate = NULL;
- route_unlock_node(pn);
+ agg_unlock_node(pn);
}
if (lPendCost) {
list_delete_and_null(&lPendCost);
pn->info = NULL;
- route_unlock_node(pn);
+ agg_unlock_node(pn);
}
RFAPI_RIB_CHECK_COUNTS(0, 0);
@@ -1466,7 +1469,7 @@ callback:
if (sendingsomeroutes)
rfapiMonitorTimersRestart(rfd, &pn->p);
- route_unlock_node(rn); /* route_node_get() */
+ agg_unlock_node(rn); /* agg_node_get() */
RFAPI_RIB_CHECK_COUNTS(1, 0);
}
@@ -1484,7 +1487,7 @@ static void rib_do_callback_onepass(struct rfapi_descriptor *rfd, afi_t afi)
struct bgp *bgp = bgp_get_default();
struct rfapi_next_hop_entry *head = NULL;
struct rfapi_next_hop_entry *tail = NULL;
- struct route_node *rn;
+ struct agg_node *rn;
#if DEBUG_L2_EXTRA
vnc_zlog_debug_verbose("%s: rfd=%p, afi=%d", __func__, rfd, afi);
@@ -1495,7 +1498,8 @@ static void rib_do_callback_onepass(struct rfapi_descriptor *rfd, afi_t afi)
assert(bgp->rfapi);
- for (rn = route_top(rfd->rib_pending[afi]); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->rib_pending[afi]); rn;
+ rn = agg_route_next(rn)) {
process_pending_node(bgp, rfd, afi, rn, &head, &tail);
}
@@ -1585,11 +1589,11 @@ static void updated_responses_queue_init(struct rfapi_descriptor *rfd)
void rfapiRibUpdatePendingNode(
struct bgp *bgp, struct rfapi_descriptor *rfd,
struct rfapi_import_table *it, /* needed for L2 */
- struct route_node *it_node, uint32_t lifetime)
+ struct agg_node *it_node, uint32_t lifetime)
{
struct prefix *prefix;
struct bgp_info *bi;
- struct route_node *pn;
+ struct agg_node *pn;
afi_t afi;
uint32_t queued_flag;
int count = 0;
@@ -1609,7 +1613,7 @@ void rfapiRibUpdatePendingNode(
prefix2str(prefix, buf, sizeof(buf));
vnc_zlog_debug_verbose("%s: prefix=%s", __func__, buf);
- pn = route_node_get(rfd->rib_pending[afi], prefix);
+ pn = agg_node_get(rfd->rib_pending[afi], prefix);
assert(pn);
vnc_zlog_debug_verbose("%s: pn->info=%p, pn->aggregate=%p", __func__,
@@ -1622,7 +1626,7 @@ void rfapiRibUpdatePendingNode(
*/
skiplist_free((struct skiplist *)(pn->aggregate));
pn->aggregate = NULL;
- route_unlock_node(pn); /* skiplist deleted */
+ agg_unlock_node(pn); /* skiplist deleted */
}
@@ -1634,7 +1638,7 @@ void rfapiRibUpdatePendingNode(
list_delete_and_null((struct list **)(&pn->info));
}
pn->info = NULL;
- route_unlock_node(pn); /* linklist or 1 deleted */
+ agg_unlock_node(pn); /* linklist or 1 deleted */
}
/*
@@ -1689,7 +1693,7 @@ void rfapiRibUpdatePendingNode(
if (!pn->aggregate) {
pn->aggregate =
skiplist_new(0, rfapi_rib_key_cmp, NULL);
- route_lock_node(pn);
+ agg_lock_node(pn);
}
/*
@@ -1715,7 +1719,7 @@ void rfapiRibUpdatePendingNode(
pn->info = list_new();
((struct list *)(pn->info))->del =
(void (*)(void *))rfapi_info_free;
- route_lock_node(pn);
+ agg_lock_node(pn);
}
listnode_add((struct list *)(pn->info), ri);
@@ -1730,10 +1734,10 @@ void rfapiRibUpdatePendingNode(
assert(!pn->aggregate);
pn->info = (void *)1; /* magic value means this node has no
routes */
- route_lock_node(pn);
+ agg_lock_node(pn);
}
- route_unlock_node(pn); /* route_node_get */
+ agg_unlock_node(pn); /* agg_node_get */
queued_flag = RFAPI_QUEUED_FLAG(afi);
@@ -1757,25 +1761,30 @@ void rfapiRibUpdatePendingNode(
void rfapiRibUpdatePendingNodeSubtree(
struct bgp *bgp, struct rfapi_descriptor *rfd,
- struct rfapi_import_table *it, struct route_node *it_node,
- struct route_node *omit_subtree, /* may be NULL */
+ struct rfapi_import_table *it, struct agg_node *it_node,
+ struct agg_node *omit_subtree, /* may be NULL */
uint32_t lifetime)
{
/* FIXME: need to find a better way here to work without sticking our
* hands in node->link */
- if (it_node->l_left && (it_node->l_left != omit_subtree)) {
- if (it_node->l_left->info)
- rfapiRibUpdatePendingNode(bgp, rfd, it, it_node->l_left,
- lifetime);
- rfapiRibUpdatePendingNodeSubtree(bgp, rfd, it, it_node->l_left,
+ if (agg_node_left(it_node)
+ && (agg_node_left(it_node) != omit_subtree)) {
+ if (agg_node_left(it_node)->info)
+ rfapiRibUpdatePendingNode(
+ bgp, rfd, it, agg_node_left(it_node), lifetime);
+ rfapiRibUpdatePendingNodeSubtree(bgp, rfd, it,
+ agg_node_left(it_node),
omit_subtree, lifetime);
}
- if (it_node->l_right && (it_node->l_right != omit_subtree)) {
- if (it_node->l_right->info)
+ if (agg_node_right(it_node)
+ && (agg_node_right(it_node) != omit_subtree)) {
+ if (agg_node_right(it_node)->info)
rfapiRibUpdatePendingNode(bgp, rfd, it,
- it_node->l_right, lifetime);
- rfapiRibUpdatePendingNodeSubtree(bgp, rfd, it, it_node->l_right,
+ agg_node_right(it_node),
+ lifetime);
+ rfapiRibUpdatePendingNodeSubtree(bgp, rfd, it,
+ agg_node_right(it_node),
omit_subtree, lifetime);
}
}
@@ -1788,13 +1797,13 @@ void rfapiRibUpdatePendingNodeSubtree(
*/
int rfapiRibFTDFilterRecentPrefix(
struct rfapi_descriptor *rfd,
- struct route_node *it_rn, /* import table node */
+ struct agg_node *it_rn, /* import table node */
struct prefix *pfx_target_original) /* query target */
{
struct bgp *bgp = rfd->bgp;
afi_t afi = family2afi(it_rn->p.family);
time_t prefix_time;
- struct route_node *trn;
+ struct agg_node *trn;
/*
* Not in FTD mode, so allow prefix
@@ -1833,10 +1842,10 @@ int rfapiRibFTDFilterRecentPrefix(
/*
* check this NVE's timestamp for this prefix
*/
- trn = route_node_get(rfd->rsp_times[afi], &it_rn->p); /* locks trn */
+ trn = agg_node_get(rfd->rsp_times[afi], &it_rn->p); /* locks trn */
prefix_time = (time_t)trn->info;
if (trn->lock > 1)
- route_unlock_node(trn);
+ agg_unlock_node(trn);
#if DEBUG_FTD_FILTER_RECENT
vnc_zlog_debug_verbose("%s: last sent time %lu, last allowed time %lu",
@@ -1883,9 +1892,9 @@ rfapiRibPreload(struct bgp *bgp, struct rfapi_descriptor *rfd,
afi_t afi;
struct rfapi_info *ri;
int need_insert;
- struct route_node *rn;
+ struct agg_node *rn;
int rib_node_started_nonempty = 0;
- struct route_node *trn;
+ struct agg_node *trn;
int allowed = 0;
/* save in case we delete nhp */
@@ -1947,13 +1956,13 @@ rfapiRibPreload(struct bgp *bgp, struct rfapi_descriptor *rfd,
/*
* Look up prefix in RIB
*/
- rn = route_node_get(rfd->rib[afi], &pfx); /* locks rn */
+ rn = agg_node_get(rfd->rib[afi], &pfx); /* locks rn */
if (rn->info) {
rib_node_started_nonempty = 1;
} else {
rn->info = skiplist_new(0, rfapi_rib_key_cmp, NULL);
- route_lock_node(rn);
+ agg_lock_node(rn);
}
/*
@@ -2063,15 +2072,15 @@ rfapiRibPreload(struct bgp *bgp, struct rfapi_descriptor *rfd,
rfapiRibStartTimer(rfd, ri, rn, 0);
RFAPI_RIB_CHECK_COUNTS(0, 0);
- route_unlock_node(rn);
+ agg_unlock_node(rn);
/*
* update this NVE's timestamp for this prefix
*/
- trn = route_node_get(rfd->rsp_times[afi], &pfx); /* locks trn */
+ trn = agg_node_get(rfd->rsp_times[afi], &pfx); /* locks trn */
trn->info = (void *)(uintptr_t)bgp_clock();
if (trn->lock > 1)
- route_unlock_node(trn);
+ agg_unlock_node(trn);
{
char str_pfx[PREFIX_STRLEN];
@@ -2108,7 +2117,7 @@ rfapiRibPreload(struct bgp *bgp, struct rfapi_descriptor *rfd,
}
void rfapiRibPendingDeleteRoute(struct bgp *bgp, struct rfapi_import_table *it,
- afi_t afi, struct route_node *it_node)
+ afi_t afi, struct agg_node *it_node)
{
struct rfapi_descriptor *rfd;
struct listnode *node;
@@ -2124,7 +2133,7 @@ void rfapiRibPendingDeleteRoute(struct bgp *bgp, struct rfapi_import_table *it,
* identifies the rfd that owns it.
*/
struct rfapi_monitor_eth *m;
- struct route_node *rn;
+ struct agg_node *rn;
struct skiplist *sl;
void *cursor;
int rc;
@@ -2154,12 +2163,12 @@ void rfapiRibPendingDeleteRoute(struct bgp *bgp, struct rfapi_import_table *it,
* NVE, it's OK to send an update with the
* delete
*/
- if ((rn = route_node_lookup(m->rfd->rib[afi],
- &it_node->p))) {
+ if ((rn = agg_node_lookup(m->rfd->rib[afi],
+ &it_node->p))) {
rfapiRibUpdatePendingNode(
bgp, m->rfd, it, it_node,
m->rfd->response_lifetime);
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
}
}
@@ -2177,8 +2186,8 @@ void rfapiRibPendingDeleteRoute(struct bgp *bgp, struct rfapi_import_table *it,
* this
* NVE, it's OK to send an update with the delete
*/
- if ((rn = route_node_lookup(m->rfd->rib[afi],
- &it_node->p))) {
+ if ((rn = agg_node_lookup(m->rfd->rib[afi],
+ &it_node->p))) {
rfapiRibUpdatePendingNode(
bgp, m->rfd, it, it_node,
m->rfd->response_lifetime);
@@ -2192,7 +2201,7 @@ void rfapiRibPendingDeleteRoute(struct bgp *bgp, struct rfapi_import_table *it,
for (ALL_LIST_ELEMENTS_RO(&bgp->rfapi->descriptors, node,
rfd)) {
- struct route_node *rn;
+ struct agg_node *rn;
vnc_zlog_debug_verbose(
"%s: comparing rfd(%p)->import_table=%p to it=%p",
@@ -2209,12 +2218,12 @@ void rfapiRibPendingDeleteRoute(struct bgp *bgp, struct rfapi_import_table *it,
* prefix
* previously, we should send an updated response.
*/
- if ((rn = route_node_lookup(rfd->rib[afi],
- &it_node->p))) {
+ if ((rn = agg_node_lookup(rfd->rib[afi],
+ &it_node->p))) {
rfapiRibUpdatePendingNode(
bgp, rfd, it, it_node,
rfd->response_lifetime);
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
}
}
@@ -2406,13 +2415,13 @@ void rfapiRibShowResponses(void *stream, struct prefix *pfx_match,
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_node *rn;
+ struct agg_node *rn;
if (!rfd->rib[afi])
continue;
- for (rn = route_top(rfd->rib[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->rib[afi]); rn;
+ rn = agg_route_next(rn)) {
struct skiplist *sl;
char str_pfx[PREFIX_STRLEN];
diff --git a/bgpd/rfapi/rfapi_rib.h b/bgpd/rfapi/rfapi_rib.h
index 0542727c2e..a8872295cd 100644
--- a/bgpd/rfapi/rfapi_rib.h
+++ b/bgpd/rfapi/rfapi_rib.h
@@ -93,17 +93,17 @@ extern void rfapiRibFree(struct rfapi_descriptor *rfd);
extern void rfapiRibUpdatePendingNode(struct bgp *bgp,
struct rfapi_descriptor *rfd,
struct rfapi_import_table *it,
- struct route_node *it_node,
+ struct agg_node *it_node,
uint32_t lifetime);
extern void rfapiRibUpdatePendingNodeSubtree(struct bgp *bgp,
struct rfapi_descriptor *rfd,
struct rfapi_import_table *it,
- struct route_node *it_node,
- struct route_node *omit_subtree,
+ struct agg_node *it_node,
+ struct agg_node *omit_subtree,
uint32_t lifetime);
-extern int rfapiRibPreloadBi(struct route_node *rfd_rib_node,
+extern int rfapiRibPreloadBi(struct agg_node *rfd_rib_node,
struct prefix *pfx_vn, struct prefix *pfx_un,
uint32_t lifetime, struct bgp_info *bi);
@@ -113,7 +113,7 @@ rfapiRibPreload(struct bgp *bgp, struct rfapi_descriptor *rfd,
extern void rfapiRibPendingDeleteRoute(struct bgp *bgp,
struct rfapi_import_table *it, afi_t afi,
- struct route_node *it_node);
+ struct agg_node *it_node);
extern void rfapiRibShowResponsesSummary(void *stream);
@@ -124,7 +124,7 @@ extern void rfapiRibShowResponses(void *stream, struct prefix *pfx_match,
extern int rfapiRibFTDFilterRecentPrefix(
struct rfapi_descriptor *rfd,
- struct route_node *it_rn, /* import table node */
+ struct agg_node *it_rn, /* import table node */
struct prefix *pfx_target_original); /* query target */
extern void rfapiFreeRfapiUnOptionChain(struct rfapi_un_option *p);
diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c
index cd12edbccb..b2767da8b2 100644
--- a/bgpd/rfapi/rfapi_vty.c
+++ b/bgpd/rfapi/rfapi_vty.c
@@ -23,7 +23,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/memory.h"
#include "lib/routemap.h"
@@ -742,7 +742,7 @@ static void rfapiDebugPrintMonitorEncap(void *stream,
m->bi, HVTYNL);
}
-void rfapiShowItNode(void *stream, struct route_node *rn)
+void rfapiShowItNode(void *stream, struct agg_node *rn)
{
struct bgp_info *bi;
char buf[BUFSIZ];
@@ -766,10 +766,10 @@ void rfapiShowItNode(void *stream, struct route_node *rn)
/* doesn't show montors */
}
-void rfapiShowImportTable(void *stream, const char *label,
- struct route_table *rt, int isvpn)
+void rfapiShowImportTable(void *stream, const char *label, struct agg_table *rt,
+ int isvpn)
{
- struct route_node *rn;
+ struct agg_node *rn;
char buf[BUFSIZ];
int (*fp)(void *, const char *, ...);
@@ -782,7 +782,7 @@ void rfapiShowImportTable(void *stream, const char *label,
fp(out, "Import Table [%s]%s", label, HVTYNL);
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
struct bgp_info *bi;
if (rn->p.family == AF_ETHERNET) {
@@ -851,7 +851,7 @@ int rfapiShowVncQueries(void *stream, struct prefix *pfx_match)
for (ALL_LIST_ELEMENTS_RO(&h->descriptors, node, rfd)) {
- struct route_node *rn;
+ struct agg_node *rn;
int printedquerier = 0;
@@ -868,8 +868,8 @@ int rfapiShowVncQueries(void *stream, struct prefix *pfx_match)
* IP Queries
*/
if (rfd->mon) {
- for (rn = route_top(rfd->mon); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(rfd->mon); rn;
+ rn = agg_route_next(rn)) {
struct rfapi_monitor_vpn *m;
char buf_remain[BUFSIZ];
char buf_pfx[BUFSIZ];
@@ -1012,7 +1012,7 @@ int rfapiShowVncQueries(void *stream, struct prefix *pfx_match)
}
static int rfapiPrintRemoteRegBi(struct bgp *bgp, void *stream,
- struct route_node *rn, struct bgp_info *bi)
+ struct agg_node *rn, struct bgp_info *bi)
{
int (*fp)(void *, const char *, ...);
struct vty *vty;
@@ -1218,13 +1218,13 @@ static int rfapiShowRemoteRegistrationsIt(struct bgp *bgp, void *stream,
for (afi = AFI_IP; afi < AFI_MAX; ++afi) {
- struct route_node *rn;
+ struct agg_node *rn;
if (!it->imported_vpn[afi])
continue;
- for (rn = route_top(it->imported_vpn[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(it->imported_vpn[afi]); rn;
+ rn = agg_route_next(rn)) {
struct bgp_info *bi;
int count_only;
diff --git a/bgpd/rfapi/rfapi_vty.h b/bgpd/rfapi/rfapi_vty.h
index a08183aa46..8b881292ac 100644
--- a/bgpd/rfapi/rfapi_vty.h
+++ b/bgpd/rfapi/rfapi_vty.h
@@ -124,7 +124,7 @@ extern char *rfapiMonitorVpn2Str(struct rfapi_monitor_vpn *m, char *buf,
extern const char *rfapiRfapiIpPrefix2Str(struct rfapi_ip_prefix *p, char *buf,
int bufsize);
-extern void rfapiShowItNode(void *stream, struct route_node *rn);
+extern void rfapiShowItNode(void *stream, struct agg_node *rn);
extern char *rfapiEthAddr2Str(const struct ethaddr *ea, char *buf, int bufsize);
diff --git a/bgpd/rfapi/vnc_export_bgp.c b/bgpd/rfapi/vnc_export_bgp.c
index 69426670a1..6289175645 100644
--- a/bgpd/rfapi/vnc_export_bgp.c
+++ b/bgpd/rfapi/vnc_export_bgp.c
@@ -25,7 +25,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/log.h"
#include "lib/stream.h"
@@ -54,7 +54,7 @@
static void vnc_direct_add_rn_group_rd(struct bgp *bgp,
struct rfapi_nve_group_cfg *rfg,
- struct route_node *rn, struct attr *attr,
+ struct agg_node *rn, struct attr *attr,
afi_t afi,
struct rfapi_descriptor *irfd);
@@ -172,7 +172,7 @@ static int getce(struct bgp *bgp, struct attr *attr, struct prefix *pfx_ce)
}
-void vnc_direct_bgp_add_route_ce(struct bgp *bgp, struct route_node *rn,
+void vnc_direct_bgp_add_route_ce(struct bgp *bgp, struct agg_node *rn,
struct bgp_info *bi)
{
struct attr *attr = bi->attr;
@@ -327,7 +327,7 @@ void vnc_direct_bgp_add_route_ce(struct bgp *bgp, struct route_node *rn,
/*
* "Withdrawing a Route" export process
*/
-void vnc_direct_bgp_del_route_ce(struct bgp *bgp, struct route_node *rn,
+void vnc_direct_bgp_del_route_ce(struct bgp *bgp, struct agg_node *rn,
struct bgp_info *bi)
{
afi_t afi = family2afi(rn->p.family);
@@ -404,7 +404,7 @@ void vnc_direct_bgp_del_route_ce(struct bgp *bgp, struct route_node *rn,
static void vnc_direct_bgp_vpn_enable_ce(struct bgp *bgp, afi_t afi)
{
- struct route_node *rn;
+ struct agg_node *rn;
struct bgp_info *ri;
vnc_zlog_debug_verbose("%s: entry, afi=%d", __func__, afi);
@@ -430,8 +430,8 @@ static void vnc_direct_bgp_vpn_enable_ce(struct bgp *bgp, afi_t afi)
/*
* Go through entire ce import table and export to BGP unicast.
*/
- for (rn = route_top(bgp->rfapi->it_ce->imported_vpn[afi]); rn;
- rn = route_next(rn)) {
+ for (rn = agg_route_top(bgp->rfapi->it_ce->imported_vpn[afi]); rn;
+ rn = agg_route_next(rn)) {
if (!rn->info)
continue;
@@ -513,7 +513,7 @@ static void vnc_direct_bgp_vpn_disable_ce(struct bgp *bgp, afi_t afi)
* Export methods that proxy nexthop BEGIN
***********************************************************************/
-static struct ecommunity *vnc_route_origin_ecom(struct route_node *rn)
+static struct ecommunity *vnc_route_origin_ecom(struct agg_node *rn)
{
struct ecommunity *new;
struct bgp_info *bi;
@@ -586,8 +586,8 @@ static struct ecommunity *vnc_route_origin_ecom_single(struct in_addr *origin)
static int
encap_attr_export(struct attr *new, struct attr *orig,
struct prefix *new_nexthop,
- struct route_node *rn) /* for VN addrs for ecom list */
- /* if rn is 0, use route's nexthop */
+ struct agg_node *rn) /* for VN addrs for ecom list */
+ /* if rn is 0, use route's nexthop */
{
struct prefix orig_nexthop;
struct prefix *use_nexthop;
@@ -692,7 +692,7 @@ encap_attr_export(struct attr *new, struct attr *orig,
*/
void vnc_direct_bgp_add_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn)
+ struct agg_node *rn)
{
struct attr attr = {0};
struct listnode *node, *nnode;
@@ -803,7 +803,7 @@ void vnc_direct_bgp_add_prefix(struct bgp *bgp,
*/
void vnc_direct_bgp_del_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn)
+ struct agg_node *rn)
{
struct listnode *node, *nnode;
struct rfapi_rfg_name *rfgn;
@@ -965,8 +965,8 @@ void vnc_direct_bgp_add_nve(struct bgp *bgp, struct rfapi_descriptor *rfd)
*/
if (rfgn->rfg == rfg) {
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct attr attr = {0};
struct rfapi_import_table *import_table;
@@ -987,7 +987,8 @@ void vnc_direct_bgp_add_nve(struct bgp *bgp, struct rfapi_descriptor *rfd)
/*
* Walk the NVE-Group's VNC Import table
*/
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn;
+ rn = agg_route_next(rn)) {
if (rn->info) {
@@ -1111,8 +1112,8 @@ void vnc_direct_bgp_del_nve(struct bgp *bgp, struct rfapi_descriptor *rfd)
*/
if (rfg && rfgn->rfg == rfg) {
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct rfapi_import_table *import_table;
import_table = rfg->rfapi_import_table;
@@ -1128,7 +1129,8 @@ void vnc_direct_bgp_del_nve(struct bgp *bgp, struct rfapi_descriptor *rfd)
/*
* Walk the NVE-Group's VNC Import table
*/
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn;
+ rn = agg_route_next(rn)) {
if (rn->info) {
@@ -1159,7 +1161,7 @@ void vnc_direct_bgp_del_nve(struct bgp *bgp, struct rfapi_descriptor *rfd)
static void vnc_direct_add_rn_group_rd(struct bgp *bgp,
struct rfapi_nve_group_cfg *rfg,
- struct route_node *rn, struct attr *attr,
+ struct agg_node *rn, struct attr *attr,
afi_t afi, struct rfapi_descriptor *irfd)
{
struct prefix nhp;
@@ -1279,8 +1281,8 @@ static void vnc_direct_bgp_add_group_afi(struct bgp *bgp,
struct rfapi_nve_group_cfg *rfg,
afi_t afi)
{
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct attr attr = {0};
struct rfapi_import_table *import_table;
@@ -1311,7 +1313,7 @@ static void vnc_direct_bgp_add_group_afi(struct bgp *bgp,
/*
* Walk the NVE-Group's VNC Import table
*/
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
if (rn->info) {
@@ -1366,7 +1368,7 @@ void vnc_direct_bgp_add_group(struct bgp *bgp, struct rfapi_nve_group_cfg *rfg)
static void vnc_direct_del_rn_group_rd(struct bgp *bgp,
struct rfapi_nve_group_cfg *rfg,
- struct route_node *rn, afi_t afi,
+ struct agg_node *rn, afi_t afi,
struct rfapi_descriptor *irfd)
{
if (irfd == NULL)
@@ -1388,8 +1390,8 @@ static void vnc_direct_bgp_del_group_afi(struct bgp *bgp,
struct rfapi_nve_group_cfg *rfg,
afi_t afi)
{
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct rfapi_import_table *import_table;
vnc_zlog_debug_verbose("%s: entry", __func__);
@@ -1412,7 +1414,7 @@ static void vnc_direct_bgp_del_group_afi(struct bgp *bgp,
/*
* Walk the NVE-Group's VNC Import table
*/
- for (rn = route_top(rt); rn; rn = route_next(rn))
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn))
if (rn->info) {
if (rfg->type == RFAPI_GROUP_CFG_VRF)
vnc_direct_del_rn_group_rd(bgp, rfg, rn, afi,
@@ -1473,14 +1475,14 @@ void vnc_direct_bgp_reexport_group_afi(struct bgp *bgp,
}
-static void vnc_direct_bgp_unexport_table(afi_t afi, struct route_table *rt,
+static void vnc_direct_bgp_unexport_table(afi_t afi, struct agg_table *rt,
struct list *nve_list)
{
if (nve_list) {
- struct route_node *rn;
+ struct agg_node *rn;
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn; rn = agg_route_next(rn)) {
if (rn->info) {
diff --git a/bgpd/rfapi/vnc_export_bgp_p.h b/bgpd/rfapi/vnc_export_bgp_p.h
index c164a35432..e074c3eaad 100644
--- a/bgpd/rfapi/vnc_export_bgp_p.h
+++ b/bgpd/rfapi/vnc_export_bgp_p.h
@@ -29,19 +29,19 @@
#include "rfapi_private.h"
-extern void vnc_direct_bgp_add_route_ce(struct bgp *bgp, struct route_node *rn,
+extern void vnc_direct_bgp_add_route_ce(struct bgp *bgp, struct agg_node *rn,
struct bgp_info *bi);
-extern void vnc_direct_bgp_del_route_ce(struct bgp *bgp, struct route_node *rn,
+extern void vnc_direct_bgp_del_route_ce(struct bgp *bgp, struct agg_node *rn,
struct bgp_info *bi);
extern void vnc_direct_bgp_add_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn);
+ struct agg_node *rn);
extern void vnc_direct_bgp_del_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn);
+ struct agg_node *rn);
extern void vnc_direct_bgp_add_nve(struct bgp *bgp,
struct rfapi_descriptor *rfd);
diff --git a/bgpd/rfapi/vnc_export_table.c b/bgpd/rfapi/vnc_export_table.c
index bbdb59c125..5e00a1017b 100644
--- a/bgpd/rfapi/vnc_export_table.c
+++ b/bgpd/rfapi/vnc_export_table.c
@@ -21,7 +21,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/memory.h"
#include "lib/vty.h"
@@ -33,11 +33,11 @@
#include "bgpd/rfapi/rfapi_import.h"
#include "bgpd/rfapi/vnc_debug.h"
-struct route_node *vnc_etn_get(struct bgp *bgp, vnc_export_type_t type,
- struct prefix *p)
+struct agg_node *vnc_etn_get(struct bgp *bgp, vnc_export_type_t type,
+ struct prefix *p)
{
- struct route_table *t = NULL;
- struct route_node *rn = NULL;
+ struct agg_table *t = NULL;
+ struct agg_node *rn = NULL;
afi_t afi;
if (!bgp || !bgp->rfapi)
@@ -49,27 +49,27 @@ struct route_node *vnc_etn_get(struct bgp *bgp, vnc_export_type_t type,
switch (type) {
case EXPORT_TYPE_BGP:
if (!bgp->rfapi->rt_export_bgp[afi])
- bgp->rfapi->rt_export_bgp[afi] = route_table_init();
+ bgp->rfapi->rt_export_bgp[afi] = agg_table_init();
t = bgp->rfapi->rt_export_bgp[afi];
break;
case EXPORT_TYPE_ZEBRA:
if (!bgp->rfapi->rt_export_zebra[afi])
- bgp->rfapi->rt_export_zebra[afi] = route_table_init();
+ bgp->rfapi->rt_export_zebra[afi] = agg_table_init();
t = bgp->rfapi->rt_export_zebra[afi];
break;
}
if (t)
- rn = route_node_get(t, p);
+ rn = agg_node_get(t, p);
return rn;
}
-struct route_node *vnc_etn_lookup(struct bgp *bgp, vnc_export_type_t type,
- struct prefix *p)
+struct agg_node *vnc_etn_lookup(struct bgp *bgp, vnc_export_type_t type,
+ struct prefix *p)
{
- struct route_table *t = NULL;
- struct route_node *rn = NULL;
+ struct agg_table *t = NULL;
+ struct agg_node *rn = NULL;
afi_t afi;
if (!bgp || !bgp->rfapi)
@@ -81,19 +81,19 @@ struct route_node *vnc_etn_lookup(struct bgp *bgp, vnc_export_type_t type,
switch (type) {
case EXPORT_TYPE_BGP:
if (!bgp->rfapi->rt_export_bgp[afi])
- bgp->rfapi->rt_export_bgp[afi] = route_table_init();
+ bgp->rfapi->rt_export_bgp[afi] = agg_table_init();
t = bgp->rfapi->rt_export_bgp[afi];
break;
case EXPORT_TYPE_ZEBRA:
if (!bgp->rfapi->rt_export_zebra[afi])
- bgp->rfapi->rt_export_zebra[afi] = route_table_init();
+ bgp->rfapi->rt_export_zebra[afi] = agg_table_init();
t = bgp->rfapi->rt_export_zebra[afi];
break;
}
if (t)
- rn = route_node_lookup(t, p);
+ rn = agg_node_lookup(t, p);
return rn;
}
@@ -101,7 +101,7 @@ struct vnc_export_info *vnc_eti_get(struct bgp *bgp, vnc_export_type_t etype,
struct prefix *p, struct peer *peer,
uint8_t type, uint8_t subtype)
{
- struct route_node *etn;
+ struct agg_node *etn;
struct vnc_export_info *eti;
etn = vnc_etn_get(bgp, etype, p);
@@ -116,7 +116,7 @@ struct vnc_export_info *vnc_eti_get(struct bgp *bgp, vnc_export_type_t etype,
}
if (eti) {
- route_unlock_node(etn);
+ agg_unlock_node(etn);
} else {
eti = XCALLOC(MTYPE_RFAPI_ETI, sizeof(struct vnc_export_info));
assert(eti);
@@ -134,7 +134,7 @@ struct vnc_export_info *vnc_eti_get(struct bgp *bgp, vnc_export_type_t etype,
void vnc_eti_delete(struct vnc_export_info *goner)
{
- struct route_node *etn;
+ struct agg_node *etn;
struct vnc_export_info *eti;
struct vnc_export_info *eti_prev = NULL;
@@ -160,7 +160,7 @@ void vnc_eti_delete(struct vnc_export_info *goner)
goner->node = NULL;
XFREE(MTYPE_RFAPI_ETI, goner);
- route_unlock_node(etn);
+ agg_unlock_node(etn);
}
struct vnc_export_info *vnc_eti_checktimer(struct bgp *bgp,
@@ -168,7 +168,7 @@ struct vnc_export_info *vnc_eti_checktimer(struct bgp *bgp,
struct prefix *p, struct peer *peer,
uint8_t type, uint8_t subtype)
{
- struct route_node *etn;
+ struct agg_node *etn;
struct vnc_export_info *eti;
etn = vnc_etn_lookup(bgp, etype, p);
@@ -183,7 +183,7 @@ struct vnc_export_info *vnc_eti_checktimer(struct bgp *bgp,
}
}
- route_unlock_node(etn);
+ agg_unlock_node(etn);
if (eti && eti->timer)
return eti;
diff --git a/bgpd/rfapi/vnc_export_table.h b/bgpd/rfapi/vnc_export_table.h
index 3ccf8661e7..fdb35e81e1 100644
--- a/bgpd/rfapi/vnc_export_table.h
+++ b/bgpd/rfapi/vnc_export_table.h
@@ -37,7 +37,7 @@ typedef enum vnc_export_type {
struct vnc_export_info {
struct vnc_export_info *next;
- struct route_node *node;
+ struct agg_node *node;
struct peer *peer;
uint8_t type;
uint8_t subtype;
@@ -45,11 +45,11 @@ struct vnc_export_info {
struct thread *timer;
};
-extern struct route_node *vnc_etn_get(struct bgp *bgp, vnc_export_type_t type,
- struct prefix *p);
+extern struct agg_node *vnc_etn_get(struct bgp *bgp, vnc_export_type_t type,
+ struct prefix *p);
-extern struct route_node *
-vnc_etn_lookup(struct bgp *bgp, vnc_export_type_t type, struct prefix *p);
+extern struct agg_node *vnc_etn_lookup(struct bgp *bgp, vnc_export_type_t type,
+ struct prefix *p);
extern struct vnc_export_info *vnc_eti_get(struct bgp *bgp,
vnc_export_type_t etype,
diff --git a/bgpd/rfapi/vnc_import_bgp.c b/bgpd/rfapi/vnc_import_bgp.c
index 72363f7cfe..6022e4cc24 100644
--- a/bgpd/rfapi/vnc_import_bgp.c
+++ b/bgpd/rfapi/vnc_import_bgp.c
@@ -25,7 +25,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/vty.h"
#include "lib/log.h"
#include "lib/memory.h"
@@ -1737,9 +1737,9 @@ static void vnc_import_bgp_exterior_add_route_it(
rfapiUnicastNexthop2Prefix(afi, info->attr, &pfx_orig_nexthop);
for (it = h->imports; it; it = it->next) {
- struct route_table *table;
- struct route_node *rn;
- struct route_node *par;
+ struct agg_table *table;
+ struct agg_node *rn;
+ struct agg_node *par;
struct bgp_info *bi_interior;
int have_usable_route;
@@ -1753,7 +1753,7 @@ static void vnc_import_bgp_exterior_add_route_it(
table = it->imported_vpn[afi];
- for (rn = route_node_match(table, &pfx_orig_nexthop),
+ for (rn = agg_node_match(table, &pfx_orig_nexthop),
have_usable_route = 0;
(!have_usable_route) && rn;) {
@@ -1821,9 +1821,9 @@ static void vnc_import_bgp_exterior_add_route_it(
0, NULL,
(void (*)(void *))
prefix_free);
- route_lock_node(rn); /* for skiplist */
+ agg_lock_node(rn); /* for skiplist */
}
- route_lock_node(rn); /* for skiplist entry */
+ agg_lock_node(rn); /* for skiplist entry */
prefix_copy(pfx_mon, prefix);
if (!skiplist_insert(
RFAPI_MONITOR_EXTERIOR(rn)->source,
@@ -1832,14 +1832,14 @@ static void vnc_import_bgp_exterior_add_route_it(
bgp_info_lock(info);
}
}
- par = rn->parent;
+ par = agg_node_parent(rn);
if (par)
- route_lock_node(par);
- route_unlock_node(rn);
+ agg_lock_node(par);
+ agg_unlock_node(rn);
rn = par;
}
if (rn)
- route_unlock_node(rn);
+ agg_unlock_node(rn);
if (!have_usable_route) {
struct prefix *pfx_mon = prefix_new();
@@ -1928,15 +1928,15 @@ void vnc_import_bgp_exterior_del_route(
rfapiUnicastNexthop2Prefix(afi, info->attr, &pfx_orig_nexthop);
for (it = h->imports; it; it = it->next) {
- struct route_table *table;
- struct route_node *rn;
- struct route_node *par;
+ struct agg_table *table;
+ struct agg_node *rn;
+ struct agg_node *par;
struct bgp_info *bi_interior;
int have_usable_route;
table = it->imported_vpn[afi];
- for (rn = route_node_match(table, &pfx_orig_nexthop),
+ for (rn = agg_node_match(table, &pfx_orig_nexthop),
have_usable_route = 0;
(!have_usable_route) && rn;) {
@@ -1987,9 +1987,9 @@ void vnc_import_bgp_exterior_del_route(
info, NULL)) {
bgp_info_unlock(info);
- route_unlock_node(
+ agg_unlock_node(
rn); /* sl entry
- */
+ */
}
if (skiplist_empty(
RFAPI_MONITOR_EXTERIOR(
@@ -2002,7 +2002,7 @@ void vnc_import_bgp_exterior_del_route(
RFAPI_MONITOR_EXTERIOR(
rn)
->source = NULL;
- route_unlock_node(
+ agg_unlock_node(
rn); /* skiplist
itself
*/
@@ -2010,14 +2010,14 @@ void vnc_import_bgp_exterior_del_route(
}
}
}
- par = rn->parent;
+ par = agg_node_parent(rn);
if (par)
- route_lock_node(par);
- route_unlock_node(rn);
+ agg_lock_node(par);
+ agg_unlock_node(rn);
rn = par;
}
if (rn)
- route_unlock_node(rn);
+ agg_unlock_node(rn);
if (!have_usable_route) {
if (!skiplist_delete(it->monitor_exterior_orphans, info,
@@ -2038,11 +2038,11 @@ void vnc_import_bgp_exterior_del_route(
*/
void vnc_import_bgp_exterior_add_route_interior(
struct bgp *bgp, struct rfapi_import_table *it,
- struct route_node *rn_interior, /* VPN IT node */
- struct bgp_info *bi_interior) /* VPN IT route */
+ struct agg_node *rn_interior, /* VPN IT node */
+ struct bgp_info *bi_interior) /* VPN IT route */
{
afi_t afi = family2afi(rn_interior->p.family);
- struct route_node *par;
+ struct agg_node *par;
struct bgp_info *bi_exterior;
struct prefix *pfx_exterior; /* exterior pfx */
void *cursor;
@@ -2161,7 +2161,8 @@ void vnc_import_bgp_exterior_add_route_interior(
* Look up the tree for possible pulldown candidates.
* Find nearest parent with an exterior route monitor
*/
- for (par = rn_interior->parent; par; par = par->parent) {
+ for (par = agg_node_parent(rn_interior); par;
+ par = agg_node_parent(par)) {
if (RFAPI_HAS_MONITOR_EXTERIOR(par))
break;
}
@@ -2211,13 +2212,13 @@ void vnc_import_bgp_exterior_add_route_interior(
->source = skiplist_new(
0, NULL,
(void (*)(void *))prefix_free);
- route_lock_node(rn_interior);
+ agg_lock_node(rn_interior);
}
skiplist_insert(
RFAPI_MONITOR_EXTERIOR(rn_interior)
->source,
bi_exterior, pfx_mon);
- route_lock_node(rn_interior);
+ agg_lock_node(rn_interior);
/*
* Delete constructed exterior routes based on
@@ -2291,12 +2292,12 @@ void vnc_import_bgp_exterior_add_route_interior(
skiplist_delete(RFAPI_MONITOR_EXTERIOR(par)->source,
bi_exterior, NULL);
- route_unlock_node(par); /* sl entry */
+ agg_unlock_node(par); /* sl entry */
}
if (skiplist_empty(RFAPI_MONITOR_EXTERIOR(par)->source)) {
skiplist_free(RFAPI_MONITOR_EXTERIOR(par)->source);
RFAPI_MONITOR_EXTERIOR(par)->source = NULL;
- route_unlock_node(par); /* sl itself */
+ agg_unlock_node(par); /* sl itself */
}
}
@@ -2353,12 +2354,12 @@ void vnc_import_bgp_exterior_add_route_interior(
skiplist_new(
0, NULL,
(void (*)(void *))prefix_free);
- route_lock_node(rn_interior); /* sl */
+ agg_lock_node(rn_interior); /* sl */
}
skiplist_insert(
RFAPI_MONITOR_EXTERIOR(rn_interior)->source,
bi_exterior, pfx_mon);
- route_lock_node(rn_interior); /* sl entry */
+ agg_lock_node(rn_interior); /* sl entry */
if (!list_adopted) {
list_adopted = list_new();
}
@@ -2397,7 +2398,7 @@ void vnc_import_bgp_exterior_add_route_interior(
}
if (list_adopted) {
struct listnode *node;
- struct route_node *bi_exterior;
+ struct agg_node *bi_exterior;
for (ALL_LIST_ELEMENTS_RO(list_adopted, node, bi_exterior)) {
skiplist_delete(it->monitor_exterior_orphans,
@@ -2419,11 +2420,11 @@ void vnc_import_bgp_exterior_add_route_interior(
*/
void vnc_import_bgp_exterior_del_route_interior(
struct bgp *bgp, struct rfapi_import_table *it,
- struct route_node *rn_interior, /* VPN IT node */
- struct bgp_info *bi_interior) /* VPN IT route */
+ struct agg_node *rn_interior, /* VPN IT node */
+ struct bgp_info *bi_interior) /* VPN IT route */
{
afi_t afi = family2afi(rn_interior->p.family);
- struct route_node *par;
+ struct agg_node *par;
struct bgp_info *bi_exterior;
struct prefix *pfx_exterior; /* exterior pfx */
void *cursor;
@@ -2509,7 +2510,8 @@ void vnc_import_bgp_exterior_del_route_interior(
* If none is found, par will end up NULL, and we will move
* the monitors to the orphan list for this import table
*/
- for (par = rn_interior->parent; par; par = par->parent) {
+ for (par = agg_node_parent(rn_interior); par;
+ par = agg_node_parent(par)) {
if (RFAPI_MONITOR_EXTERIOR(par)->valid_interior_count)
break;
}
@@ -2540,11 +2542,11 @@ void vnc_import_bgp_exterior_del_route_interior(
skiplist_new(
0, NULL,
(void (*)(void *))prefix_free);
- route_lock_node(par); /* sl */
+ agg_lock_node(par); /* sl */
}
skiplist_insert(RFAPI_MONITOR_EXTERIOR(par)->source,
bi_exterior, pfx_mon);
- route_lock_node(par); /* sl entry */
+ agg_lock_node(par); /* sl entry */
/* Add constructed exterior routes based on parent */
for (bi = par->info; bi; bi = bi->next) {
@@ -2596,12 +2598,12 @@ void vnc_import_bgp_exterior_del_route_interior(
skiplist_delete_first(
RFAPI_MONITOR_EXTERIOR(rn_interior)->source);
- route_unlock_node(rn_interior); /* sl entry */
+ agg_unlock_node(rn_interior); /* sl entry */
}
if (skiplist_empty(RFAPI_MONITOR_EXTERIOR(rn_interior)->source)) {
skiplist_free(RFAPI_MONITOR_EXTERIOR(rn_interior)->source);
RFAPI_MONITOR_EXTERIOR(rn_interior)->source = NULL;
- route_unlock_node(rn_interior); /* sl itself */
+ agg_unlock_node(rn_interior); /* sl itself */
}
}
diff --git a/bgpd/rfapi/vnc_import_bgp_p.h b/bgpd/rfapi/vnc_import_bgp_p.h
index b38fa2276a..a6fcae926d 100644
--- a/bgpd/rfapi/vnc_import_bgp_p.h
+++ b/bgpd/rfapi/vnc_import_bgp_p.h
@@ -29,13 +29,13 @@
extern void vnc_import_bgp_exterior_add_route_interior(
struct bgp *bgp, struct rfapi_import_table *it,
- struct route_node *rn_interior, /* VPN IT node */
- struct bgp_info *bi_interior); /* VPN IT route */
+ struct agg_node *rn_interior, /* VPN IT node */
+ struct bgp_info *bi_interior); /* VPN IT route */
extern void vnc_import_bgp_exterior_del_route_interior(
struct bgp *bgp, struct rfapi_import_table *it,
- struct route_node *rn_interior, /* VPN IT node */
- struct bgp_info *bi_interior); /* VPN IT route */
+ struct agg_node *rn_interior, /* VPN IT node */
+ struct bgp_info *bi_interior); /* VPN IT route */
extern void
vnc_import_bgp_exterior_redist_enable_it(struct bgp *bgp, afi_t afi,
diff --git a/bgpd/rfapi/vnc_zebra.c b/bgpd/rfapi/vnc_zebra.c
index a2871188e6..a93fb60735 100644
--- a/bgpd/rfapi/vnc_zebra.c
+++ b/bgpd/rfapi/vnc_zebra.c
@@ -25,7 +25,7 @@
#include "lib/zebra.h"
#include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
#include "lib/log.h"
#include "lib/command.h"
#include "lib/zclient.h"
@@ -556,7 +556,7 @@ static void import_table_to_nve_list_zebra(struct bgp *bgp,
static void vnc_zebra_add_del_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn,
+ struct agg_node *rn,
int add) /* !0 = add, 0 = del */
{
struct list *nves;
@@ -611,14 +611,14 @@ static void vnc_zebra_add_del_prefix(struct bgp *bgp,
void vnc_zebra_add_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn)
+ struct agg_node *rn)
{
vnc_zebra_add_del_prefix(bgp, import_table, rn, 1);
}
void vnc_zebra_del_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn)
+ struct agg_node *rn)
{
vnc_zebra_add_del_prefix(bgp, import_table, rn, 0);
}
@@ -678,8 +678,8 @@ static void vnc_zebra_add_del_nve(struct bgp *bgp, struct rfapi_descriptor *rfd,
*/
if (rfgn->rfg == rfg) {
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct rfapi_import_table *import_table;
import_table = rfg->rfapi_import_table;
@@ -692,7 +692,8 @@ static void vnc_zebra_add_del_nve(struct bgp *bgp, struct rfapi_descriptor *rfd,
/*
* Walk the NVE-Group's VNC Import table
*/
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn;
+ rn = agg_route_next(rn)) {
if (rn->info) {
@@ -721,8 +722,8 @@ static void vnc_zebra_add_del_group_afi(struct bgp *bgp,
struct rfapi_nve_group_cfg *rfg,
afi_t afi, int add)
{
- struct route_table *rt = NULL;
- struct route_node *rn;
+ struct agg_table *rt = NULL;
+ struct agg_node *rn;
struct rfapi_import_table *import_table;
uint8_t family = afi2family(afi);
@@ -773,7 +774,8 @@ static void vnc_zebra_add_del_group_afi(struct bgp *bgp,
/*
* Walk the NVE-Group's VNC Import table
*/
- for (rn = route_top(rt); rn; rn = route_next(rn)) {
+ for (rn = agg_route_top(rt); rn;
+ rn = agg_route_next(rn)) {
if (rn->info) {
vnc_zebra_route_msg(&rn->p,
nexthop_count,
diff --git a/bgpd/rfapi/vnc_zebra.h b/bgpd/rfapi/vnc_zebra.h
index 708aaeef50..b8c1cb15c4 100644
--- a/bgpd/rfapi/vnc_zebra.h
+++ b/bgpd/rfapi/vnc_zebra.h
@@ -29,11 +29,11 @@
extern void vnc_zebra_add_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn);
+ struct agg_node *rn);
extern void vnc_zebra_del_prefix(struct bgp *bgp,
struct rfapi_import_table *import_table,
- struct route_node *rn);
+ struct agg_node *rn);
extern void vnc_zebra_add_nve(struct bgp *bgp, struct rfapi_descriptor *rfd);
diff --git a/bgpd/rfp-example/librfp/rfp_example.c b/bgpd/rfp-example/librfp/rfp_example.c
index cde2d7b352..2751e7a44b 100644
--- a/bgpd/rfp-example/librfp/rfp_example.c
+++ b/bgpd/rfp-example/librfp/rfp_example.c
@@ -230,7 +230,7 @@ void *rfp_start(struct thread_master *master, struct rfapi_rfp_cfg **cfgp,
/* initilize struct rfapi_rfp_cfg, see rfapi.h */
global_rfi.rfapi_config.download_type =
- RFAPI_RFP_DOWNLOAD_FULL; /* default=partial */
+ RFAPI_RFP_DOWNLOAD_PARTIAL; /* default=partial */
global_rfi.rfapi_config.ftd_advertisement_interval =
RFAPI_RFP_CFG_DEFAULT_FTD_ADVERTISEMENT_INTERVAL;
global_rfi.rfapi_config.holddown_factor =
diff --git a/common.am b/common.am
index 73f36eed1a..9c0c547811 100644
--- a/common.am
+++ b/common.am
@@ -2,8 +2,8 @@
# Automake fragment intended to be shared by Makefile.am files in the
# tree. When used, should be included at the very top of the file.
#
-AM_CPPFLAGS = @ASAN_FLAGS@ @TSAN_FLAGS@ @MSAN_FLAGS@ @WERROR@
-AM_CFLAGS = @ASAN_FLAGS@ @TSAN_FLAGS@ @MSAN_FLAGS@ @WERROR@
+AM_CPPFLAGS = @ASAN_FLAGS@ @TSAN_FLAGS@ @MSAN_FLAGS@
+AM_CFLAGS = @ASAN_FLAGS@ @TSAN_FLAGS@ @MSAN_FLAGS@ $(WERROR)
AM_V_CLIPPY = $(am__v_CLIPPY_$(V))
am__v_CLIPPY_ = $(am__v_CLIPPY_$(AM_DEFAULT_VERBOSITY))
diff --git a/configure.ac b/configure.ac
index be1c2763a1..09a6f364fb 100755
--- a/configure.ac
+++ b/configure.ac
@@ -7,7 +7,7 @@
##
AC_PREREQ(2.60)
-AC_INIT(frr, 5.1-dev, [https://github.com/frrouting/frr/issues])
+AC_INIT(frr, 6.1-dev, [https://github.com/frrouting/frr/issues])
PACKAGE_URL="https://frrouting.org/"
AC_SUBST(PACKAGE_URL)
PACKAGE_FULLNAME="FRRouting"
@@ -132,25 +132,29 @@ dnl - specifically, options to control warnings
AC_USE_SYSTEM_EXTENSIONS
AC_DEFUN([AC_C_FLAG], [{
+ m4_pushdef([cachename],[m4_translit([frr_cv_$1],[ =-],[___])])
+ AC_CACHE_CHECK([[whether $CC supports $1]], cachename, [
AC_LANG_PUSH(C)
ac_c_flag_save="$CFLAGS"
CFLAGS="$CFLAGS $1"
- AC_MSG_CHECKING([[whether $CC supports $1]])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[]])],
[
- AC_MSG_RESULT([yes])
- m4_if([$3], [], [], [
- CFLAGS="$ac_c_flag_save"
- $3
- ])
+ cachename=yes
], [
- CFLAGS="$ac_c_flag_save"
- AC_MSG_RESULT([no])
- $2
+ cachename=no
])
+ CFLAGS="$ac_c_flag_save"
AC_LANG_POP(C)
- }])
+ ])
+ if test "${cachename}" = yes; then
+ m4_if([$3], [], [CFLAGS="$CFLAGS $1"], [$3])
+ else
+ :
+ $2
+ fi
+ m4_popdef([cachename])
+}])
AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
AC_LANG_PUSH(C)
@@ -343,6 +347,8 @@ AC_ARG_ENABLE(vtysh,
AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
AC_ARG_ENABLE(doc,
AS_HELP_STRING([--disable-doc], [do not build docs]))
+AC_ARG_ENABLE(doc-html,
+ AS_HELP_STRING([--enable-doc-html], [build HTML docs]))
AC_ARG_ENABLE(zebra,
AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
AC_ARG_ENABLE(bgpd,
@@ -525,25 +531,10 @@ AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
#
# Python for clippy
#
-AS_IF([test "$host" = "$build"], [
- PYTHONCONFIG=""
- # ordering:
- # 1. try python3, but respect the user's preference on which minor ver
- # 2. try python, which might be py3 or py2 again on the user's preference
- # 3. try python2 (can really only be 2.7 but eh)
- # 4. try 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
- #
- # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
- # (AX_PYTHON does not do what we need)
-
- AC_CHECK_TOOLS([PYTHONCONFIG], [python3-config python-config python2-config])
- if test -n "$PYTHONCONFIG"; then
- PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
- PYTHON_LIBS="`\"${PYTHONCONFIG}\" --libs`"
-
- AC_MSG_CHECKING([whether we found a working Python version])
- AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
+AC_DEFUN([FRR_PYTHON_CHECK_WORKING], [
+ AC_MSG_CHECKING([whether we found a working Python version])
+ AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
#include <Python.h>
#if PY_VERSION_HEX < 0x02070000
#error python too old
@@ -556,23 +547,8 @@ int main(void);
return 0;
}
])], [
- PYTHONCONFIG=""
- unset PYTHON_LIBS
- unset PYTHON_CFLAGS
- ])
- fi
-
- if test -z "$PYTHONCONFIG"; then
- PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
- PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
- PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
- PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
- PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
- AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
- ])])])])])
-
-
- AC_MSG_CHECKING([whether we found a working Python version])
+ # some python installs are missing the zlib dependency...
+ PYTHON_LIBS="${PYTHON_LIBS} -lz"
AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
#include <Python.h>
#if PY_VERSION_HEX < 0x02070000
@@ -586,6 +562,56 @@ int main(void);
return 0;
}
])], [
+ m4_if([$1], [], [
+ PYTHONCONFIG=""
+ unset PYTHON_LIBS
+ unset PYTHON_CFLAGS
+ ], [$1])
+ ])
+ ])
+])
+
+AS_IF([test "$host" = "$build"], [
+ PYTHONCONFIG=""
+
+ # ordering:
+ # 1. try python3, but respect the user's preference on which minor ver
+ # 2. try python, which might be py3 or py2 again on the user's preference
+ # 3. try python2 (can really only be 2.7 but eh)
+ # 4. try 3.6 > 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
+ #
+ # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
+ # (AX_PYTHON does not do what we need)
+
+ AC_CHECK_TOOLS([PYTHONCONFIG], [ \
+ python3-config \
+ python-config \
+ python2-config \
+ python3.6-config \
+ python3.5-config \
+ python3.4-config \
+ python3.3-config \
+ python3.2-config \
+ python2.7-config ])
+ if test -n "$PYTHONCONFIG"; then
+ PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
+ PYTHON_LIBS="`\"${PYTHONCONFIG}\" --ldflags`"
+
+ FRR_PYTHON_CHECK_WORKING([])
+ fi
+
+ if test -z "$PYTHONCONFIG"; then
+ PKG_CHECK_MODULES([PYTHON], python-3.6, [], [
+ PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
+ PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
+ PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
+ PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
+ PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
+ AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
+ ])])])])])])
+
+
+ FRR_PYTHON_CHECK_WORKING([
AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
])
fi
@@ -1313,12 +1339,9 @@ FRR_INCLUDES
])dnl
dnl disable doc check
-if test "${enable_doc}" = "no";then
- DOC=""
-else
- AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build2], [no])
- DOC="doc"
-fi
+AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build2], [no])
+AM_CONDITIONAL(DOC, test "${enable_doc}" != "no")
+AM_CONDITIONAL(DOC_HTML, test "${enable_doc_html}" = "yes")
dnl --------------------
dnl Daemon disable check
@@ -1434,7 +1457,6 @@ fi
# set
AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
-AC_SUBST(DOC)
AC_SUBST(RFPTEST)
AC_SUBST(LIBRFP)
AC_SUBST(RFPINC)
@@ -1518,8 +1540,8 @@ AC_SEARCH_LIBS(dlopen, [dl dld], [], [
AC_CHECK_HEADERS([link.h])
-AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
-AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#ifdef HAVE_LINK_H
#include <link.h>
@@ -1529,14 +1551,17 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
char origin[1];
dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
]])], [
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
-], [
- AC_MSG_RESULT(no)
+ frr_cv_rtld_di_origin=yes
+ ], [
+ frr_cv_rtld_di_origin=no
+ ])
])
+if test "$frr_cv_rtld_di_origin" = yes; then
+ AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
+fi
-AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
-AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#ifdef HAVE_LINK_H
#include <link.h>
@@ -1546,12 +1571,14 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
struct link_map *lm = NULL;
dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
]])], [
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
-], [
- AC_MSG_RESULT(no)
+ frr_cv_rtld_di_linkmap=yes
+ ], [
+ frr_cv_rtld_di_linkmap=no
+ ])
])
-
+if test "$frr_cv_rtld_di_linkmap" = yes; then
+ AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
+fi
AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
@@ -1808,8 +1835,8 @@ dnl mallinfo, e.g. such as Umem on Solaris.
dnl -----------------------------------------
AC_CHECK_HEADERS([malloc.h malloc/malloc.h],,, [FRR_INCLUDES])
-AC_MSG_CHECKING(whether mallinfo is available)
-AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
+AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
@@ -1819,11 +1846,14 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
]], [[
struct mallinfo ac_x; ac_x = mallinfo ();
]])], [
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_MALLINFO,,mallinfo)
-], [
- AC_MSG_RESULT(no)
+ frr_cv_mallinfo=yes
+ ], [
+ frr_cv_mallinfo=no
+ ])
])
+if test "$frr_cv_mallinfo" = yes; then
+ AC_DEFINE(HAVE_MALLINFO,,mallinfo)
+fi
AC_MSG_CHECKING(whether malloc_usable_size is available)
AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
@@ -1983,18 +2013,16 @@ AC_CACHE_VAL(ac_cv_htonl_works,
)
AC_MSG_RESULT($ac_cv_htonl_works)
-AC_CONFIG_FILES([Makefile
+AC_CONFIG_FILES([Makefile],[sed -e 's/^#AUTODERP# //' -i Makefile])
+
+AC_CONFIG_FILES([
bgpd/Makefile
vtysh/Makefile
- doc/Makefile
- doc/user/Makefile
- doc/manpages/Makefile
- doc/developer/Makefile
tests/Makefile
bgpd/rfp-example/rfptest/Makefile
bgpd/rfp-example/librfp/Makefile
redhat/frr.spec
- debianpkg/Makefile
+ solaris/Makefile
debianpkg/changelog
alpine/APKBUILD
snapcraft/snapcraft.yaml
@@ -2010,8 +2038,6 @@ if test "${enable_bgp_vnc}" != "no"; then
fi
fi
-AC_CONFIG_FILES([solaris/Makefile])
-
AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
AC_CONFIG_COMMANDS([lib/route_types.h], [
diff --git a/debianpkg/Makefile.am b/debianpkg/Makefile.am
deleted file mode 100644
index e7ae4bb58d..0000000000
--- a/debianpkg/Makefile.am
+++ /dev/null
@@ -1,47 +0,0 @@
-
-EXTRA_DIST = README.Debian README.Maintainer \
- changelog compat control copyright \
- rules source/format tests/control \
- tests/daemons watchfrr.rc \
- backports/README backports/rules \
- backports/debian8/debian/source/format \
- backports/debian8/exclude \
- backports/debian8/versionext \
- backports/debian9/debian/source/format \
- backports/debian9/exclude \
- backports/debian9/versionext \
- backports/ubuntu12.04/debian/control \
- backports/ubuntu12.04/debian/frr.install \
- backports/ubuntu12.04/debian/frr.postinst \
- backports/ubuntu12.04/debian/frr.postrm \
- backports/ubuntu12.04/debian/rules \
- backports/ubuntu12.04/debian/source/format \
- backports/ubuntu12.04/exclude \
- backports/ubuntu12.04/versionext \
- backports/ubuntu14.04/debian/control \
- backports/ubuntu14.04/debian/frr.install \
- backports/ubuntu14.04/debian/frr.postinst \
- backports/ubuntu14.04/debian/frr.postrm \
- backports/ubuntu14.04/debian/rules \
- backports/ubuntu14.04/debian/source/format \
- backports/ubuntu14.04/exclude \
- backports/ubuntu14.04/versionext \
- backports/ubuntu16.04/debian/source/format \
- backports/ubuntu16.04/exclude \
- backports/ubuntu16.04/versionext \
- backports/ubuntu17.10/debian/control \
- backports/ubuntu17.10/debian/source/format \
- backports/ubuntu17.10/exclude \
- backports/ubuntu17.10/versionext \
- backports/ubuntu18.04/debian/control \
- backports/ubuntu18.04/debian/source/format \
- backports/ubuntu18.04/exclude \
- backports/ubuntu18.04/versionext \
- frr-doc.docs frr-doc.info frr-doc.install \
- frr-doc.lintian-overrides frr.conf \
- frr-dbg.lintian-overrides \
- frr.dirs frr.docs frr.install \
- frr.lintian-overrides frr.logrotate \
- frr.manpages frr.pam frr.postinst frr.postrm \
- frr.preinst frr.prerm \
- frr-pythontools.install
diff --git a/debianpkg/subdir.am b/debianpkg/subdir.am
new file mode 100644
index 0000000000..b6251962b7
--- /dev/null
+++ b/debianpkg/subdir.am
@@ -0,0 +1,72 @@
+#
+# debianpkg
+#
+
+EXTRA_DIST += \
+ debianpkg/README.Debian \
+ debianpkg/README.Maintainer \
+ debianpkg/changelog \
+ debianpkg/compat \
+ debianpkg/control \
+ debianpkg/copyright \
+ debianpkg/rules \
+ debianpkg/source/format \
+ debianpkg/tests/control \
+ debianpkg/tests/daemons \
+ debianpkg/watchfrr.rc \
+ \
+ debianpkg/backports/README \
+ debianpkg/backports/rules \
+ debianpkg/backports/debian8/debian/source/format \
+ debianpkg/backports/debian8/exclude \
+ debianpkg/backports/debian8/versionext \
+ debianpkg/backports/debian9/debian/source/format \
+ debianpkg/backports/debian9/exclude \
+ debianpkg/backports/debian9/versionext \
+ debianpkg/backports/ubuntu12.04/debian/control \
+ debianpkg/backports/ubuntu12.04/debian/frr.install \
+ debianpkg/backports/ubuntu12.04/debian/frr.postinst \
+ debianpkg/backports/ubuntu12.04/debian/frr.postrm \
+ debianpkg/backports/ubuntu12.04/debian/rules \
+ debianpkg/backports/ubuntu12.04/debian/source/format \
+ debianpkg/backports/ubuntu12.04/exclude \
+ debianpkg/backports/ubuntu12.04/versionext \
+ debianpkg/backports/ubuntu14.04/debian/control \
+ debianpkg/backports/ubuntu14.04/debian/frr.install \
+ debianpkg/backports/ubuntu14.04/debian/frr.postinst \
+ debianpkg/backports/ubuntu14.04/debian/frr.postrm \
+ debianpkg/backports/ubuntu14.04/debian/rules \
+ debianpkg/backports/ubuntu14.04/debian/source/format \
+ debianpkg/backports/ubuntu14.04/exclude \
+ debianpkg/backports/ubuntu14.04/versionext \
+ debianpkg/backports/ubuntu16.04/debian/source/format \
+ debianpkg/backports/ubuntu16.04/exclude \
+ debianpkg/backports/ubuntu16.04/versionext \
+ debianpkg/backports/ubuntu17.10/debian/control \
+ debianpkg/backports/ubuntu17.10/debian/source/format \
+ debianpkg/backports/ubuntu17.10/exclude \
+ debianpkg/backports/ubuntu17.10/versionext \
+ debianpkg/backports/ubuntu18.04/debian/control \
+ debianpkg/backports/ubuntu18.04/debian/source/format \
+ debianpkg/backports/ubuntu18.04/exclude \
+ debianpkg/backports/ubuntu18.04/versionext \
+ \
+ debianpkg/frr-dbg.lintian-overrides \
+ debianpkg/frr-doc.docs \
+ debianpkg/frr-doc.info \
+ debianpkg/frr-doc.install \
+ debianpkg/frr-doc.lintian-overrides \
+ debianpkg/frr-pythontools.install \
+ debianpkg/frr.conf \
+ debianpkg/frr.dirs \
+ debianpkg/frr.docs \
+ debianpkg/frr.install \
+ debianpkg/frr.lintian-overrides \
+ debianpkg/frr.logrotate \
+ debianpkg/frr.manpages \
+ debianpkg/frr.pam \
+ debianpkg/frr.postinst \
+ debianpkg/frr.postrm \
+ debianpkg/frr.preinst \
+ debianpkg/frr.prerm \
+ # end
diff --git a/doc/.gitignore b/doc/.gitignore
index e539d9a97b..d99a6a5b2d 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -1,5 +1,4 @@
-Makefile
-Makefile.in
+!Makefile
mdate-sh
draft-zebra-00.txt
*.pdf
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000000..3b4d3d24ab
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,18 @@
+all: ALWAYS
+ @$(MAKE) -s -C .. doc
+%: ALWAYS
+ @$(MAKE) -s -C .. doc/$@
+html:
+ @$(MAKE) -s -C .. doc/user/_build/html/.buildinfo
+info:
+ @$(MAKE) -s -C .. doc/user/_build/texinfo/frr.info
+pdf:
+ @$(MAKE) -s -C .. doc/user/_build/latexpdf
+frr.info: info
+frr.pdf: pdf
+
+Makefile:
+ #nothing
+ALWAYS:
+.PHONY: ALWAYS makefiles html info frr.info pdf frr.pdf
+.SUFFIXES:
diff --git a/doc/Makefile.am b/doc/Makefile.am
deleted file mode 100644
index f421865054..0000000000
--- a/doc/Makefile.am
+++ /dev/null
@@ -1,293 +0,0 @@
-## Process this file with automake to produce Makefile.in.
-
-# Pass down make invocation to each subdirectory.
-#
-# Each of these directories contains a Sphinx-generated Makefile that has been
-# modified to implement all the targets required by Automake, as documented in
-# the 'Third-Party Makefiles' section of the Automake docs.
-#
-# Note the absence of the 'developer' directory here; development docs are
-# never built as part of a regular build. They are only built when explicitly
-# asked for. See comment further down.
-
-# Sphinx is not designed to be invoked multiple times against the same toctree.
-.NOTPARALLEL:
-
-SUBDIRS = manpages user
-AM_MAKEFLAGS = DESTDIR=${DESTDIR} infodir=${infodir}
-
-MANPAGE_BUILDDIR = manpages/_build/man
-
-# This is a hack, see comment further down.
-man_MANS = $(MANPAGE_BUILDDIR)/frr.1
-
-if PIMD
-man_MANS += $(MANPAGE_BUILDDIR)/pimd.8
-man_MANS += $(MANPAGE_BUILDDIR)/mtracebis.8
-endif
-
-if PBRD
-man_MANS += $(MANPAGE_BUILDDIR)/pbrd.8
-endif
-
-if BGPD
-man_MANS += $(MANPAGE_BUILDDIR)/bgpd.8
-endif
-
-if ISISD
-man_MANS += $(MANPAGE_BUILDDIR)/isisd.8
-endif
-
-if OSPF6D
-man_MANS += $(MANPAGE_BUILDDIR)/ospf6d.8
-endif
-
-if OSPFCLIENT
-man_MANS += $(MANPAGE_BUILDDIR)/ospfclient.8
-endif
-
-if OSPFD
-man_MANS += $(MANPAGE_BUILDDIR)/ospfd.8
-endif
-
-if LDPD
-man_MANS += $(MANPAGE_BUILDDIR)/ldpd.8
-endif
-
-if RIPD
-man_MANS += $(MANPAGE_BUILDDIR)/ripd.8
-endif
-
-if RIPNGD
-man_MANS += $(MANPAGE_BUILDDIR)/ripngd.8
-endif
-
-if NHRPD
-man_MANS += $(MANPAGE_BUILDDIR)/nhrpd.8
-endif
-
-if VTYSH
-man_MANS += $(MANPAGE_BUILDDIR)/vtysh.1
-endif
-
-if WATCHFRR
-man_MANS += $(MANPAGE_BUILDDIR)/watchfrr.8
-endif
-
-if ZEBRA
-man_MANS += $(MANPAGE_BUILDDIR)/zebra.8
-endif
-
-if EIGRPD
-man_MANS += $(MANPAGE_BUILDDIR)/eigrpd.8
-endif
-
-if SHARPD
-man_MANS += $(MANPAGE_BUILDDIR)/sharpd.8
-endif
-
-if STATICD
-man_MANS += $(MANPAGE_BUILDDIR)/staticd.8
-endif
-
-if BFDD
-man_MANS += $(MANPAGE_BUILDDIR)/bfdd.8
-endif
-
-# Automake is particular about manpages. It is aware of them and has some
-# special facilities for handling them, but it assumes that manpages are always
-# given in groff source and so these facilities are limited to simply
-# specifying the path to the groff sources in a special variable. There is no
-# target for building manpages that can be extended, as there are for pdf,
-# html, dvi, etc. Unfortunately this leaves us with hijacking the
-# 'install-data' and 'all' targets in the 3rd-party Makefile in manpages/ to
-# make sure manpages are always built, and then using the special Automake
-# variable defined above in order to take advantage of automatic installation.
-#
-# However, it is conceivable that someone may want to build just the manpages,
-# so here's an explicit target for that.
-man:
- $(MAKE) -C manpages man
-
-# Automake automatically defines targets for various document formats. All of
-# the child 3rd-party Makefiles are aware of all Automake targets and implement
-# the ones we are interested in.
-#
-# The SUBDIRS variable at the top of this Makefile.am causes the following
-# implicit Automake targets to only build user documentation, and not developer
-# documentation:
-# - info
-# - html
-# - pdf
-#
-# If you wish to build developer documentation, use these targets:
-developer-info:
- $(MAKE) -C developer info
-
-developer-pdf:
- $(MAKE) -C developer latexpdf
-
-developer-html:
- $(MAKE) -C developer html
-
-# If you want to build the developer's docs in other formats, try the
-# following:
-#
-# $ cd developer
-# $ make help
-
-# dist tarballs want doc sources
-EXTRA_DIST = frr-sphinx.mk \
- manpages/bgpd.rst \
- manpages/common-options.rst \
- manpages/conf.py \
- manpages/defines.rst \
- manpages/eigrpd.rst \
- manpages/epilogue.rst \
- manpages/frr.rst \
- manpages/index.rst \
- manpages/isisd.rst \
- manpages/ldpd.rst \
- manpages/Makefile.am \
- manpages/mtracebis.rst \
- manpages/nhrpd.rst \
- manpages/ospf6d.rst \
- manpages/ospfclient.rst \
- manpages/ospfd.rst \
- manpages/pimd.rst \
- manpages/ripd.rst \
- manpages/pbrd.rst \
- manpages/ripngd.rst \
- manpages/sharpd.rst \
- manpages/staticd.rst \
- manpages/vtysh.rst \
- manpages/watchfrr.rst \
- manpages/zebra.rst \
- manpages/bfdd.rst \
- manpages/bfd-options.rst \
- developer/bgpd.rst \
- developer/bgp-typecodes.rst \
- developer/building-frr-on-alpine.rst \
- developer/building-frr-on-centos6.rst \
- developer/building-frr-on-centos7.rst \
- developer/building-frr-on-debian8.rst \
- developer/building-frr-on-debian9.rst \
- developer/building-frr-on-fedora24.rst \
- developer/building-frr-on-freebsd10.rst \
- developer/building-frr-on-freebsd11.rst \
- developer/building-frr-on-freebsd9.rst \
- developer/building-frr-on-lede-openwrt.rst \
- developer/building-frr-on-netbsd6.rst \
- developer/building-frr-on-netbsd7.rst \
- developer/building-frr-on-omnios.rst \
- developer/building-frr-on-openbsd6.rst \
- developer/building-frr-on-ubuntu1204.rst \
- developer/building-frr-on-ubuntu1404.rst \
- developer/building-frr-on-ubuntu1604.rst \
- developer/building-frr-on-ubuntu1804.rst \
- developer/building.rst \
- developer/cli.rst \
- developer/conf.py \
- developer/draft-zebra-00.ms \
- developer/hooks.rst \
- developer/index.rst \
- developer/ldpd-basic-test-setup.md \
- developer/library.rst \
- developer/logging.rst \
- developer/Makefile.in \
- developer/maintainer-release-build.rst \
- developer/memtypes.rst \
- developer/modules.rst \
- developer/next-hop-tracking.rst \
- developer/ospf-api.rst \
- developer/ospf.rst \
- developer/ospf-sr.rst \
- developer/workflow.rst \
- developer/zebra.rst \
- user/babeld.rst \
- user/ldpd.rst \
- user/basic.rst \
- user/bgp.rst \
- user/bugs.rst \
- user/conf.py \
- user/eigrpd.rst \
- user/filter.rst \
- user/glossary.rst \
- user/index.rst \
- user/installation.rst \
- user/ipv6.rst \
- user/isisd.rst \
- user/kernel.rst \
- user/Makefile.am \
- user/nhrpd.rst \
- user/ospf6d.rst \
- user/ospfd.rst \
- user/ospf_fundamentals.rst \
- user/overview.rst \
- user/packet-dumps.rst \
- user/pim.rst \
- user/ripd.rst \
- user/pbr.rst \
- user/ripngd.rst \
- user/routemap.rst \
- user/routeserver.rst \
- user/rpki.rst \
- user/setup.rst \
- user/sharp.rst \
- user/snmp.rst \
- user/snmptrap.rst \
- user/static.rst \
- user/Useful_Sysctl_Settings.md \
- user/vnc.rst \
- user/vtysh.rst \
- user/zebra.rst \
- user/bfd.rst \
- user/flowspec.rst \
- mpls/ChangeLog.opaque.txt \
- mpls/ospfd.conf \
- mpls/cli_summary.txt \
- mpls/opaque_lsa.txt \
- figures/cligraph.png \
- figures/cligraph.svg \
- figures/fig-normal-processing.dia \
- figures/fig-normal-processing.png \
- figures/fig-normal-processing.txt \
- figures/fig-rs-processing.dia \
- figures/fig-rs-processing.png \
- figures/fig-rs-processing.txt \
- figures/fig_topologies_full.dia \
- figures/fig_topologies_full.png \
- figures/fig_topologies_full.txt \
- figures/fig_topologies_rs.dia \
- figures/fig_topologies_rs.png \
- figures/fig_topologies_rs.txt \
- figures/fig-vnc-commercial-route-reflector.dia \
- figures/fig-vnc-commercial-route-reflector.png \
- figures/fig-vnc-commercial-route-reflector.txt \
- figures/fig-vnc-frr-route-reflector.dia \
- figures/fig-vnc-frr-route-reflector.png \
- figures/fig-vnc-frr-route-reflector.txt \
- figures/fig-vnc-gw.dia \
- figures/fig-vnc-gw.png \
- figures/fig-vnc-gw-rr.dia \
- figures/fig-vnc-gw-rr.png \
- figures/fig-vnc-gw-rr.txt \
- figures/fig-vnc-gw.txt \
- figures/fig-vnc-mesh.dia \
- figures/fig-vnc-mesh.png \
- figures/fig-vnc-mesh.txt \
- figures/fig-vnc-redundant-route-reflectors.dia \
- figures/fig-vnc-redundant-route-reflectors.png \
- figures/fig-vnc-redundant-route-reflectors.txt \
- figures/frr-icon.svg \
- figures/frr-logo-icon.png \
- figures/frr-logo-medium.png \
- figures/frr-logo.png \
- figures/frr-logo-small.png \
- figures/git_branches.png \
- figures/git_branches.svg \
- figures/ospf_api_architecture.png \
- figures/ospf_api_msghdr.png \
- figures/ospf_api_msgs1.png \
- figures/ospf_api_msgs2.png \
- extra/frrlexer.py
diff --git a/doc/developer/Makefile b/doc/developer/Makefile
new file mode 100644
index 0000000000..38afb43a70
--- /dev/null
+++ b/doc/developer/Makefile
@@ -0,0 +1,16 @@
+all: ALWAYS
+ @$(MAKE) -s -C ../.. developer-html
+help: ALWAYS
+ @$(MAKE) -s -C ../.. doc/help
+pdf: ALWAYS
+ @$(MAKE) -s -C ../.. doc/developer/_build/latexpdf
+info: ALWAYS
+ @$(MAKE) -s -C ../.. doc/developer/_build/texinfo/frr.info
+%: ALWAYS
+ @$(MAKE) -s -C ../.. doc/developer/_build/$@
+
+Makefile:
+ #nothing
+ALWAYS:
+.PHONY: ALWAYS makefiles
+.SUFFIXES:
diff --git a/doc/developer/Makefile.am b/doc/developer/Makefile.am
deleted file mode 100644
index 76758f9242..0000000000
--- a/doc/developer/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-# This is necessary to support VPATH builds.
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-# This variable is used as the documentation source location in frr-sphinx.mk
-SOURCESDIR = @srcdir@
-
-include @srcdir@/../frr-sphinx.mk
diff --git a/doc/developer/building-frr-on-alpine.rst b/doc/developer/building-frr-for-alpine.rst
index d303784d4e..d303784d4e 100644
--- a/doc/developer/building-frr-on-alpine.rst
+++ b/doc/developer/building-frr-for-alpine.rst
diff --git a/doc/developer/building-frr-on-centos6.rst b/doc/developer/building-frr-for-centos6.rst
index d50376548f..d4c2c3bfd0 100644
--- a/doc/developer/building-frr-on-centos6.rst
+++ b/doc/developer/building-frr-for-centos6.rst
@@ -40,98 +40,96 @@ Install required packages
Add packages:
-::
+.. code-block:: shell
- sudo yum install git autoconf automake libtool make gawk \
+ sudo yum install git autoconf automake libtool make gawk \
readline-devel texinfo net-snmp-devel groff pkgconfig \
json-c-devel pam-devel flex epel-release perl-XML-LibXML \
c-ares-devel
-Install newer version of bison (CentOS 6 package source is too old) from
-CentOS 7
+Install newer version of bison (CentOS 6 package source is too old) from CentOS
+7:
-::
+.. code-block:: shell
- sudo yum install rpm-build
- curl -O http://vault.centos.org/7.0.1406/os/Source/SPackages/bison-2.7-4.el7.src.rpm
- rpmbuild --rebuild ./bison-2.7-4.el7.src.rpm
- sudo yum install ./rpmbuild/RPMS/x86_64/bison-2.7-4.el6.x86_64.rpm
- rm -rf rpmbuild
+ sudo yum install rpm-build
+ curl -O http://vault.centos.org/7.0.1406/os/Source/SPackages/bison-2.7-4.el7.src.rpm
+ rpmbuild --rebuild ./bison-2.7-4.el7.src.rpm
+ sudo yum install ./rpmbuild/RPMS/x86_64/bison-2.7-4.el6.x86_64.rpm
+ rm -rf rpmbuild
-Install newer version of autoconf and automake (Package versions are too
-old)
+Install newer version of autoconf and automake (Package versions are too old):
-::
+.. code-block:: shell
- curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
- tar xvf autoconf-2.69.tar.gz
- cd autoconf-2.69
- ./configure --prefix=/usr
- make
- sudo make install
- cd ..
-
- curl -O http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
- tar xvf automake-1.15.tar.gz
- cd automake-1.15
- ./configure --prefix=/usr
- make
- sudo make install
- cd ..
-
-Install ``Python 2.7`` in parallel to default 2.6. Make sure you've
-install EPEL (``epel-release`` as above). Then install current
-``python27``, ``python27-devel`` and ``pytest``
+ curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
+ tar xvf autoconf-2.69.tar.gz
+ cd autoconf-2.69
+ ./configure --prefix=/usr
+ make
+ sudo make install
+ cd ..
-::
+ curl -O http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
+ tar xvf automake-1.15.tar.gz
+ cd automake-1.15
+ ./configure --prefix=/usr
+ make
+ sudo make install
+ cd ..
+
+Install ``Python 2.7`` in parallel to default 2.6. Make sure you've install
+EPEL (``epel-release`` as above). Then install current ``python27``:
+``python27-devel`` and ``pytest``
+
+.. code-block:: shell
- sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- sudo rpm -ivh https://centos6.iuscommunity.org/ius-release.rpm
- sudo yum install python27 python27-pip python27-devel
- sudo pip2.7 install pytest
+ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
+ sudo rpm -ivh https://centos6.iuscommunity.org/ius-release.rpm
+ sudo yum install python27 python27-pip python27-devel
+ sudo pip2.7 install pytest
-Please note that ``CentOS 6`` needs to keep python pointing to version
-2.6 for ``yum`` to keep working, so don't create a symlink for python2.7
-to python
+Please note that ``CentOS 6`` needs to keep python pointing to version 2.6 for
+``yum`` to keep working, so don't create a symlink for python2.7 to python.
-Install newer ``Sphinx-Build`` based on ``Python 2.7``
+Install newer ``Sphinx-Build`` based on ``Python 2.7``.
Create a new repo ``/etc/yum.repos.d/puias6.repo`` with the following contents:
::
- ### Name: RPM Repository for RHEL 6 - PUIAS (used for Sphinx-Build)
- ### URL: http://springdale.math.ias.edu/data/puias/computational
- [puias-computational]
- name = RPM Repository for RHEL 6 - Sphinx-Build
- baseurl = http://springdale.math.ias.edu/data/puias/computational/$releasever/$basearch
- #mirrorlist =
- enabled = 1
- protect = 0
- gpgkey =
- gpgcheck = 0
+ ### Name: RPM Repository for RHEL 6 - PUIAS (used for Sphinx-Build)
+ ### URL: http://springdale.math.ias.edu/data/puias/computational
+ [puias-computational]
+ name = RPM Repository for RHEL 6 - Sphinx-Build
+ baseurl = http://springdale.math.ias.edu/data/puias/computational/$releasever/$basearch
+ #mirrorlist =
+ enabled = 1
+ protect = 0
+ gpgkey =
+ gpgcheck = 0
Update rpm database & Install newer sphinx
-::
+.. code-block:: shell
- sudo yum update
- sudo yum install python27-sphinx
+ sudo yum update
+ sudo yum install python27-sphinx
Get FRR, compile it and install it (from Git)
---------------------------------------------
-**This assumes you want to build and install FRR from source and not
-using any packages**
+**This assumes you want to build and install FRR from source and not using any
+packages**
Add frr groups and user
^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block:: shell
- sudo groupadd -g 92 frr
- sudo groupadd -r -g 85 frrvt
- sudo useradd -u 92 -g 92 -M -r -G frrvt -s /sbin/nologin \
+ sudo groupadd -g 92 frr
+ sudo groupadd -r -g 85 frrvt
+ sudo useradd -u 92 -g 92 -M -r -G frrvt -s /sbin/nologin \
-c "FRR FRRouting suite" -d /var/run/frr frr
Download Source, configure and compile it
@@ -140,7 +138,7 @@ Download Source, configure and compile it
(You may prefer different options on configure statement. These are just
an example.)
-::
+.. code-block:: shell
git clone https://github.com/frrouting/frr.git frr
cd frr
@@ -178,32 +176,50 @@ an example.)
Create empty FRR configuration files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block:: shell
+
+ sudo mkdir /var/log/frr
+ sudo mkdir /etc/frr
+
+For integrated config file:
- sudo mkdir /var/log/frr
- sudo mkdir /etc/frr
- sudo touch /etc/frr/zebra.conf
- sudo touch /etc/frr/bgpd.conf
- sudo touch /etc/frr/ospfd.conf
- sudo touch /etc/frr/ospf6d.conf
- sudo touch /etc/frr/isisd.conf
- sudo touch /etc/frr/ripd.conf
- sudo touch /etc/frr/ripngd.conf
- sudo touch /etc/frr/nhrpd.conf
- sudo touch /etc/frr/eigrpd.conf
- sudo touch /etc/frr/babeld.conf
- sudo chown -R frr:frr /etc/frr/
- sudo touch /etc/frr/vtysh.conf
- sudo chown frr:frrvt /etc/frr/vtysh.conf
- sudo chmod 640 /etc/frr/*.conf
+.. code-block:: shell
+
+ sudo touch /etc/frr/frr.conf
+
+For individual config files:
+
+.. note:: Integrated config is preferred to individual config.
+
+.. code-block:: shell
+
+ sudo touch /etc/frr/babeld.conf
+ sudo touch /etc/frr/bfdd.conf
+ sudo touch /etc/frr/bgpd.conf
+ sudo touch /etc/frr/eigrpd.conf
+ sudo touch /etc/frr/isisd.conf
+ sudo touch /etc/frr/ldpd.conf
+ sudo touch /etc/frr/nhrpd.conf
+ sudo touch /etc/frr/ospf6d.conf
+ sudo touch /etc/frr/ospfd.conf
+ sudo touch /etc/frr/pbrd.conf
+ sudo touch /etc/frr/pimd.conf
+ sudo touch /etc/frr/ripd.conf
+ sudo touch /etc/frr/ripngd.conf
+ sudo touch /etc/frr/staticd.conf
+ sudo touch /etc/frr/zebra.conf
+ sudo chown -R frr:frr /etc/frr/
+ sudo touch /etc/frr/vtysh.conf
+ sudo chown frr:frrvty /etc/frr/vtysh.conf
+ sudo chmod 640 /etc/frr/*.conf
Install daemon config file
^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block:: shell
- sudo install -p -m 644 redhat/daemons /etc/frr/
- sudo chown frr:frr /etc/frr/daemons
+ sudo install -p -m 644 redhat/daemons /etc/frr/
+ sudo chown frr:frr /etc/frr/daemons
Edit /etc/frr/daemons as needed to select the required daemons
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -214,42 +230,40 @@ Enable the daemons as required by changing the value to ``yes``
Enable IP & IPv6 forwarding
^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Edit ``/etc/sysctl.conf`` and set the following values (ignore the other
-settings)
+Edit :file:`/etc/sysctl.conf` and set the following values (ignore the other
+settings)::
-::
-
- # Controls IP packet forwarding
- net.ipv4.ip_forward = 1
- net.ipv6.conf.all.forwarding=1
+ # Controls IP packet forwarding
+ net.ipv4.ip_forward = 1
+ net.ipv6.conf.all.forwarding=1
- # Controls source route verification
- net.ipv4.conf.default.rp_filter = 0
+ # Controls source route verification
+ net.ipv4.conf.default.rp_filter = 0
Load the modifed sysctl's on the system:
-::
+.. code-block:: shell
- sudo sysctl -p /etc/sysctl.d/90-routing-sysctl.conf
+ sudo sysctl -p /etc/sysctl.d/90-routing-sysctl.conf
Add init.d startup files
^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block::
- sudo install -p -m 755 redhat/frr.init /etc/init.d/frr
- sudo chkconfig --add frr
+ sudo install -p -m 755 redhat/frr.init /etc/init.d/frr
+ sudo chkconfig --add frr
-Enable frr daemon at startup
+Enable FRR daemon at startup
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block::
- sudo chkconfig frr on
+ sudo chkconfig frr on
Start FRR manually (or reboot)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block::
- sudo /etc/init.d/frr start
+ sudo /etc/init.d/frr start
diff --git a/doc/developer/building-frr-on-centos7.rst b/doc/developer/building-frr-for-centos7.rst
index 31cd4dcc49..31cd4dcc49 100644
--- a/doc/developer/building-frr-on-centos7.rst
+++ b/doc/developer/building-frr-for-centos7.rst
diff --git a/doc/developer/building-frr-on-debian8.rst b/doc/developer/building-frr-for-debian8.rst
index d1e65a472d..d1e65a472d 100644
--- a/doc/developer/building-frr-on-debian8.rst
+++ b/doc/developer/building-frr-for-debian8.rst
diff --git a/doc/developer/building-frr-on-debian9.rst b/doc/developer/building-frr-for-debian9.rst
index 7dad9a7bd4..7dad9a7bd4 100644
--- a/doc/developer/building-frr-on-debian9.rst
+++ b/doc/developer/building-frr-for-debian9.rst
diff --git a/doc/developer/building-frr-on-fedora24.rst b/doc/developer/building-frr-for-fedora24.rst
index 208c580b63..208c580b63 100644
--- a/doc/developer/building-frr-on-fedora24.rst
+++ b/doc/developer/building-frr-for-fedora24.rst
diff --git a/doc/developer/building-frr-on-freebsd10.rst b/doc/developer/building-frr-for-freebsd10.rst
index 5d14db5fa7..95f09e8c22 100644
--- a/doc/developer/building-frr-on-freebsd10.rst
+++ b/doc/developer/building-frr-for-freebsd10.rst
@@ -78,21 +78,41 @@ an example)
Create empty FRR configuration files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block:: shell
+
+ sudo mkdir /usr/local/etc/frr
+
+For integrated config file:
+
+.. code-block:: shell
+
+ sudo touch /usr/local/etc/frr/frr.conf
+
+For individual config files:
+
+.. note:: Integrated config is preferred to individual config.
+
+.. code-block:: shell
- sudo mkdir /usr/local/etc/frr
- sudo touch /usr/local/etc/frr/zebra.conf
- sudo touch /usr/local/etc/frr/bgpd.conf
- sudo touch /usr/local/etc/frr/ospfd.conf
- sudo touch /usr/local/etc/frr/ospf6d.conf
- sudo touch /usr/local/etc/frr/isisd.conf
- sudo touch /usr/local/etc/frr/ripd.conf
- sudo touch /usr/local/etc/frr/ripngd.conf
- sudo touch /usr/local/etc/frr/pimd.conf
- sudo chown -R frr:frr /usr/local/etc/frr
- sudo touch /usr/local/etc/frr/vtysh.conf
- sudo chown frr:frrvty /usr/local/etc/frr/vtysh.conf
- sudo chmod 640 /usr/local/etc/frr/*.conf
+ sudo touch /usr/local/etc/frr/babeld.conf
+ sudo touch /usr/local/etc/frr/bfdd.conf
+ sudo touch /usr/local/etc/frr/bgpd.conf
+ sudo touch /usr/local/etc/frr/eigrpd.conf
+ sudo touch /usr/local/etc/frr/isisd.conf
+ sudo touch /usr/local/etc/frr/ldpd.conf
+ sudo touch /usr/local/etc/frr/nhrpd.conf
+ sudo touch /usr/local/etc/frr/ospf6d.conf
+ sudo touch /usr/local/etc/frr/ospfd.conf
+ sudo touch /usr/local/etc/frr/pbrd.conf
+ sudo touch /usr/local/etc/frr/pimd.conf
+ sudo touch /usr/local/etc/frr/ripd.conf
+ sudo touch /usr/local/etc/frr/ripngd.conf
+ sudo touch /usr/local/etc/frr/staticd.conf
+ sudo touch /usr/local/etc/frr/zebra.conf
+ sudo chown -R frr:frr /usr/local/etc/frr/
+ sudo touch /usr/local/etc/frr/vtysh.conf
+ sudo chown frr:frrvty /usr/local/etc/frr/vtysh.conf
+ sudo chmod 640 /usr/local/etc/frr/*.conf
Enable IP & IPv6 forwarding
^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -101,9 +121,8 @@ Add the following lines to the end of ``/etc/sysctl.conf``:
::
- # Routing: We need to forward packets
- net.inet.ip.forwarding=1
- net.inet6.ip6.forwarding=1
+ # Routing: We need to forward packets
+ net.inet.ip.forwarding=1
+ net.inet6.ip6.forwarding=1
-**Reboot** or use ``sysctl`` to apply the same config to the running
-system
+**Reboot** or use ``sysctl`` to apply the same config to the running system.
diff --git a/doc/developer/building-frr-for-freebsd11.rst b/doc/developer/building-frr-for-freebsd11.rst
new file mode 100644
index 0000000000..ce5941440c
--- /dev/null
+++ b/doc/developer/building-frr-for-freebsd11.rst
@@ -0,0 +1,133 @@
+FreeBSD 11
+==========
+
+FreeBSD 11 restrictions:
+------------------------
+
+- MPLS is not supported on ``FreeBSD``. MPLS requires a Linux Kernel
+ (4.5 or higher). LDP can be built, but may have limited use without
+ MPLS
+
+Install required packages
+-------------------------
+
+Add packages: (Allow the install of the package managment tool if this
+is first package install and asked)
+
+.. code-block:: shell
+
+ pkg install git autoconf automake libtool gmake gawk json-c pkgconf \
+ bison flex py27-pytest c-ares python3 py36-sphinx texinfo
+
+Make sure there is no /usr/bin/flex preinstalled (and use the newly
+installed in /usr/local/bin): (FreeBSD frequently provides a older flex
+as part of the base OS which takes preference in path)
+
+.. code-block:: shell
+
+ rm -f /usr/bin/flex
+
+Get FRR, compile it and install it (from Git)
+---------------------------------------------
+
+**This assumes you want to build and install FRR from source and not using any
+packages**
+
+Add frr group and user
+^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: shell
+
+ pw groupadd frr -g 101
+ pw groupadd frrvty -g 102
+ pw adduser frr -g 101 -u 101 -G 102 -c "FRR suite" \
+ -d /usr/local/etc/frr -s /usr/sbin/nologin
+
+
+Download Source, configure and compile it
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+(You may prefer different options on configure statement. These are just
+an example)
+
+.. code-block:: shell
+
+ git clone https://github.com/frrouting/frr.git frr
+ cd frr
+ ./bootstrap.sh
+ setenv MAKE gmake
+ setenv LDFLAGS -L/usr/local/lib
+ setenv CPPFLAGS -I/usr/local/include
+ ln -s /usr/local/bin/sphinx-build-3.6 /usr/local/bin/sphinx-build
+ ./configure \
+ --sysconfdir=/usr/local/etc/frr \
+ --enable-pkgsrcrcdir=/usr/pkg/share/examples/rc.d \
+ --localstatedir=/var/run/frr \
+ --prefix=/usr/local \
+ --enable-ospfclient=yes \
+ --enable-ospfapi=yes \
+ --enable-multipath=64 \
+ --enable-user=frr \
+ --enable-group=frr \
+ --enable-vty-group=frrvty \
+ --enable-configfile-mask=0640 \
+ --enable-logfile-mask=0640 \
+ --enable-rtadv \
+ --enable-fpm \
+ --with-pkg-git-version \
+ --with-pkg-extra-version=-MyOwnFRRVersion
+ gmake
+ gmake check
+ sudo gmake install
+
+Create empty FRR configuration files
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: shell
+
+ sudo mkdir /usr/local/etc/frr
+
+For integrated config file:
+
+.. code-block:: shell
+
+ sudo touch /usr/local/etc/frr/frr.conf
+
+For individual config files:
+
+.. note:: Integrated config is preferred to individual config.
+
+.. code-block:: shell
+
+ sudo touch /usr/local/etc/frr/babeld.conf
+ sudo touch /usr/local/etc/frr/bfdd.conf
+ sudo touch /usr/local/etc/frr/bgpd.conf
+ sudo touch /usr/local/etc/frr/eigrpd.conf
+ sudo touch /usr/local/etc/frr/isisd.conf
+ sudo touch /usr/local/etc/frr/ldpd.conf
+ sudo touch /usr/local/etc/frr/nhrpd.conf
+ sudo touch /usr/local/etc/frr/ospf6d.conf
+ sudo touch /usr/local/etc/frr/ospfd.conf
+ sudo touch /usr/local/etc/frr/pbrd.conf
+ sudo touch /usr/local/etc/frr/pimd.conf
+ sudo touch /usr/local/etc/frr/ripd.conf
+ sudo touch /usr/local/etc/frr/ripngd.conf
+ sudo touch /usr/local/etc/frr/staticd.conf
+ sudo touch /usr/local/etc/frr/zebra.conf
+ sudo chown -R frr:frr /usr/local/etc/frr/
+ sudo touch /usr/local/etc/frr/vtysh.conf
+ sudo chown frr:frrvty /usr/local/etc/frr/vtysh.conf
+ sudo chmod 640 /usr/local/etc/frr/*.conf
+
+Enable IP & IPv6 forwarding
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Add the following lines to the end of ``/etc/sysctl.conf``:
+
+::
+
+ # Routing: We need to forward packets
+ net.inet.ip.forwarding=1
+ net.inet6.ip6.forwarding=1
+
+**Reboot** or use ``sysctl`` to apply the same config to the running system.
diff --git a/doc/developer/building-frr-on-freebsd9.rst b/doc/developer/building-frr-for-freebsd9.rst
index 02279debea..4f859d3510 100644
--- a/doc/developer/building-frr-on-freebsd9.rst
+++ b/doc/developer/building-frr-for-freebsd9.rst
@@ -91,21 +91,41 @@ an example)
Create empty FRR configuration files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
+.. code-block:: shell
+
+ sudo mkdir /usr/local/etc/frr
+
+For integrated config file:
+
+.. code-block:: shell
+
+ sudo touch /usr/local/etc/frr/frr.conf
+
+For individual config files:
+
+.. note:: Integrated config is preferred to individual config.
+
+.. code-block:: shell
- sudo mkdir /usr/local/etc/frr
- sudo touch /usr/local/etc/frr/zebra.conf
- sudo touch /usr/local/etc/frr/bgpd.conf
- sudo touch /usr/local/etc/frr/ospfd.conf
- sudo touch /usr/local/etc/frr/ospf6d.conf
- sudo touch /usr/local/etc/frr/isisd.conf
- sudo touch /usr/local/etc/frr/ripd.conf
- sudo touch /usr/local/etc/frr/ripngd.conf
- sudo touch /usr/local/etc/frr/pimd.conf
- sudo chown -R frr:frr /usr/local/etc/frr
- sudo touch /usr/local/etc/frr/vtysh.conf
- sudo chown frr:frrvty /usr/local/etc/frr/vtysh.conf
- sudo chmod 640 /usr/local/etc/frr/*.conf
+ sudo touch /usr/local/etc/frr/babeld.conf
+ sudo touch /usr/local/etc/frr/bfdd.conf
+ sudo touch /usr/local/etc/frr/bgpd.conf
+ sudo touch /usr/local/etc/frr/eigrpd.conf
+ sudo touch /usr/local/etc/frr/isisd.conf
+ sudo touch /usr/local/etc/frr/ldpd.conf
+ sudo touch /usr/local/etc/frr/nhrpd.conf
+ sudo touch /usr/local/etc/frr/ospf6d.conf
+ sudo touch /usr/local/etc/frr/ospfd.conf
+ sudo touch /usr/local/etc/frr/pbrd.conf
+ sudo touch /usr/local/etc/frr/pimd.conf
+ sudo touch /usr/local/etc/frr/ripd.conf
+ sudo touch /usr/local/etc/frr/ripngd.conf
+ sudo touch /usr/local/etc/frr/staticd.conf
+ sudo touch /usr/local/etc/frr/zebra.conf
+ sudo chown -R frr:frr /usr/local/etc/frr/
+ sudo touch /usr/local/etc/frr/vtysh.conf
+ sudo chown frr:frrvty /usr/local/etc/frr/vtysh.conf
+ sudo chmod 640 /usr/local/etc/frr/*.conf
Enable IP & IPv6 forwarding
^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -114,9 +134,8 @@ Add the following lines to the end of ``/etc/sysctl.conf``:
::
- # Routing: We need to forward packets
- net.inet.ip.forwarding=1
- net.inet6.ip6.forwarding=1
+ # Routing: We need to forward packets
+ net.inet.ip.forwarding=1
+ net.inet6.ip6.forwarding=1
-**Reboot** or use ``sysctl`` to apply the same config to the running
-system
+**Reboot** or use ``sysctl`` to apply the same config to the running system.
diff --git a/doc/developer/building-frr-on-netbsd6.rst b/doc/developer/building-frr-for-netbsd6.rst
index ca0845d0d0..ca0845d0d0 100644
--- a/doc/developer/building-frr-on-netbsd6.rst
+++ b/doc/developer/building-frr-for-netbsd6.rst
diff --git a/doc/developer/building-frr-on-netbsd7.rst b/doc/developer/building-frr-for-netbsd7.rst
index 86242ef965..86242ef965 100644
--- a/doc/developer/building-frr-on-netbsd7.rst
+++ b/doc/developer/building-frr-for-netbsd7.rst
diff --git a/doc/developer/building-frr-on-omnios.rst b/doc/developer/building-frr-for-omnios.rst
index 03f3845de8..03f3845de8 100644
--- a/doc/developer/building-frr-on-omnios.rst
+++ b/doc/developer/building-frr-for-omnios.rst
diff --git a/doc/developer/building-frr-on-openbsd6.rst b/doc/developer/building-frr-for-openbsd6.rst
index 46db25a025..46db25a025 100644
--- a/doc/developer/building-frr-on-openbsd6.rst
+++ b/doc/developer/building-frr-for-openbsd6.rst
diff --git a/doc/developer/building-frr-for-openwrt.rst b/doc/developer/building-frr-for-openwrt.rst
new file mode 100644
index 0000000000..b9be1b5226
--- /dev/null
+++ b/doc/developer/building-frr-for-openwrt.rst
@@ -0,0 +1,77 @@
+OpenWRT
+=======
+
+Prepare build environment
+-------------------------
+
+For Debian based distributions, run:
+
+::
+
+ sudo apt-get install git build-essential libssl-dev libncurses5-dev \
+ unzip gawk zlib1g-dev subversion mercurial
+
+For other environments, instructions can be found in the
+`official documentation
+<https://wiki.openwrt.org/doc/howto/buildroot.exigence#examples_of_package_installations>`_.
+
+
+Get OpenWRT Sources (from Git)
+------------------------------
+
+.. note::
+ The OpenWRT build will fail if you run it as root. So take care to run it as a nonprivileged user.
+
+Clone the OpenWRT sources and retrieve the package feeds
+
+::
+
+ git clone https://github.com/openwrt/openwrt.git
+ cd openwrt
+ ./scripts/feeds update -a
+ ./scripts/feeds install -a
+ cd feeds/routing
+ git fetch origin pull/319/head
+ git read-tree --prefix=frr/ -u FETCH_HEAD:frr
+ cd ../../package/feeds/routing/
+ ln -sv ../../../feeds/routing/frr .
+ cd ../../..
+
+Configure OpenWRT for your target and select the needed FRR packages in Network -> Routing and Redirection -> frr,
+exit and save
+
+::
+
+ make menuconfig
+
+Then, to compile either a complete OpenWRT image, or the FRR packages, run:
+
+::
+
+ make or make package/frr/compile
+
+It may be possible that on first build ``make package/frr/compile`` not
+to work and it may be needed to run a ``make`` for the entire build
+environment. Add ``V=s`` to get more debugging output.
+
+Work with sources
+-----------------
+
+To update to a newer version, or change other options, you need to edit the ``feeds/routing/frr/Makefile``.
+
+Usage
+-----
+
+Edit ``/usr/sbin/frr.init`` and add/remove the daemons name in section
+``DAEMONS=`` or don't install unneded packages For example: zebra bgpd ldpd
+isisd nhrpd ospfd ospf6d pimd ripd ripngd
+
+Enable the serivce
+^^^^^^^^^^^^^^^^^^
+
+- ``service frr enable``
+
+Start the service
+^^^^^^^^^^^^^^^^^
+
+- ``service frr start``
diff --git a/doc/developer/building-frr-on-ubuntu1204.rst b/doc/developer/building-frr-for-ubuntu1204.rst
index 459d411ebc..459d411ebc 100644
--- a/doc/developer/building-frr-on-ubuntu1204.rst
+++ b/doc/developer/building-frr-for-ubuntu1204.rst
diff --git a/doc/developer/building-frr-on-ubuntu1404.rst b/doc/developer/building-frr-for-ubuntu1404.rst
index 681cc30a3b..681cc30a3b 100644
--- a/doc/developer/building-frr-on-ubuntu1404.rst
+++ b/doc/developer/building-frr-for-ubuntu1404.rst
diff --git a/doc/developer/building-frr-on-ubuntu1604.rst b/doc/developer/building-frr-for-ubuntu1604.rst
index 69c4e44d98..69c4e44d98 100644
--- a/doc/developer/building-frr-on-ubuntu1604.rst
+++ b/doc/developer/building-frr-for-ubuntu1604.rst
diff --git a/doc/developer/building-frr-on-ubuntu1804.rst b/doc/developer/building-frr-for-ubuntu1804.rst
index 50e90fc7ea..50e90fc7ea 100644
--- a/doc/developer/building-frr-on-ubuntu1804.rst
+++ b/doc/developer/building-frr-for-ubuntu1804.rst
diff --git a/doc/developer/building-frr-on-freebsd11.rst b/doc/developer/building-frr-on-freebsd11.rst
deleted file mode 100644
index 87fb30226d..0000000000
--- a/doc/developer/building-frr-on-freebsd11.rst
+++ /dev/null
@@ -1,109 +0,0 @@
-FreeBSD 11
-==========================================
-
-FreeBSD 11 restrictions:
-------------------------
-
-- MPLS is not supported on ``FreeBSD``. MPLS requires a Linux Kernel
- (4.5 or higher). LDP can be built, but may have limited use without
- MPLS
-
-Install required packages
--------------------------
-
-Add packages: (Allow the install of the package managment tool if this
-is first package install and asked)
-
-::
-
- pkg install git autoconf automake libtool gmake gawk json-c pkgconf \
- bison flex py27-pytest c-ares python3 py-sphinx
-
-Make sure there is no /usr/bin/flex preinstalled (and use the newly
-installed in /usr/local/bin): (FreeBSD frequently provides a older flex
-as part of the base OS which takes preference in path)
-
-::
-
- rm -f /usr/bin/flex
-
-Get FRR, compile it and install it (from Git)
----------------------------------------------
-
-**This assumes you want to build and install FRR from source and not
-using any packages**
-
-Add frr group and user
-^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- pw groupadd frr -g 101
- pw groupadd frrvty -g 102
- pw adduser frr -g 101 -u 101 -G 102 -c "FRR suite" \
- -d /usr/local/etc/frr -s /usr/sbin/nologin
-
-(You may prefer different options on configure statement. These are just
-an example)
-
-::
-
- git clone https://github.com/frrouting/frr.git frr
- cd frr
- ./bootstrap.sh
- export MAKE=gmake
- export LDFLAGS="-L/usr/local/lib"
- export CPPFLAGS="-I/usr/local/include"
- ./configure \
- --sysconfdir=/usr/local/etc/frr \
- --enable-pkgsrcrcdir=/usr/pkg/share/examples/rc.d \
- --localstatedir=/var/run/frr \
- --prefix=/usr/local \
- --enable-ospfclient=yes \
- --enable-ospfapi=yes \
- --enable-multipath=64 \
- --enable-user=frr \
- --enable-group=frr \
- --enable-vty-group=frrvty \
- --enable-configfile-mask=0640 \
- --enable-logfile-mask=0640 \
- --enable-rtadv \
- --enable-fpm \
- --with-pkg-git-version \
- --with-pkg-extra-version=-MyOwnFRRVersion
- gmake
- gmake check
- sudo gmake install
-
-Create empty FRR configuration files
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
- sudo mkdir /usr/local/etc/frr
- sudo touch /usr/local/etc/frr/zebra.conf
- sudo touch /usr/local/etc/frr/bgpd.conf
- sudo touch /usr/local/etc/frr/ospfd.conf
- sudo touch /usr/local/etc/frr/ospf6d.conf
- sudo touch /usr/local/etc/frr/isisd.conf
- sudo touch /usr/local/etc/frr/ripd.conf
- sudo touch /usr/local/etc/frr/ripngd.conf
- sudo touch /usr/local/etc/frr/pimd.conf
- sudo chown -R frr:frr /usr/local/etc/frr
- sudo touch /usr/local/etc/frr/vtysh.conf
- sudo chown frr:frrvty /usr/local/etc/frr/vtysh.conf
- sudo chmod 640 /usr/local/etc/frr/*.conf
-
-Enable IP & IPv6 forwarding
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Add the following lines to the end of ``/etc/sysctl.conf``:
-
-::
-
- # Routing: We need to forward packets
- net.inet.ip.forwarding=1
- net.inet6.ip6.forwarding=1
-
-**Reboot** or use ``sysctl`` to apply the same config to the running
-system
diff --git a/doc/developer/building-frr-on-lede-openwrt.rst b/doc/developer/building-frr-on-lede-openwrt.rst
deleted file mode 100644
index d14754b37f..0000000000
--- a/doc/developer/building-frr-on-lede-openwrt.rst
+++ /dev/null
@@ -1,108 +0,0 @@
-OpenWRT/LEDE
-=============================================
-
-- for the moment because of cross compile problems, master is not
- supported, only up to 3.0
-- LDP can't be built because of missing Perl-XML-LibXML in OpenWRT/LEDE
- tree
-
-Prepare build environment
--------------------------
-
-https://lede-project.org/docs/guide-developer/install-buildsystem
-
-for
-
-Ubuntu 12.04LTS:
-
-::
-
- sudo apt-get install build-essential subversion git-core \
- libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc \
- libxml-parser-perl mercurial bzr ecj cvs unzip python3-sphinx
-
-Ubuntu 64bit:
-
-::
-
- sudo apt-get install build-essential subversion libncurses5-dev zlib1g-dev \
- gawk gcc-multilib flex git-core gettext libssl-dev python3-sphinx
-
-Debian 8 Jessie:
-
-::
-
- sudo apt-get install build-essential libncurses5-dev gawk git subversion \
- libssl-dev gettext unzip zlib1g-dev file python python3-sphinx
-
-Debian 9 Stretch:
-
-::
-
- sudo apt-get install build-essential libncurses5-dev gawk git subversion \
- libssl-dev gettext zlib1g-dev python3-sphinx
-
-Centos x86-64 (some packages require EPEL):
-
-::
-
- yum install subversion binutils bzip2 gcc gcc-c++ gawk gettext flex \
- ncurses-devel zlib-devel zlib-static make patch unzip glibc glibc-devel \
- perl-ExtUtils-MakeMaker glibc-static quilt ncurses-libs sed sdcc bison \
- intltool sharutils wget git-core openssl-devel xz python-sphinx
-
-Fedora 24 - 64Bit:
-
-::
-
- dnf install -y subversion binutils bzip2 gcc gcc-c++ gawk gettext git-core \
- unzip ncurses-devel ncurses-compat-libs zlib-devel zlib-static make \
- flex patch perl-ExtUtils-MakeMaker perl-Thread-Queue glibc glibc-devel \
- glibc-static quilt sed sdcc intltool sharutils bison wget openssl-devel \
- python3-sphinx
-
-Get LEDE Sources (from Git)
----------------------------
-
-LEDE and OpenWRT is planned to remerge and won't cover the similar
-OpenWRT build As normal user: git clone
-https://git.lede-project.org/source.git lede cd lede ./scripts/feeds
-update -a ./scripts/feeds install -a cd feeds/routing git pull origin
-pull/319/head ln -s ../../../feeds/routing/frr/
-../../package/feeds/routing/ cd ../.. make menuconfig
-
-Select the needed target then select needed packages in Network ->
-Routing and Redirection -> frr, exit and save
-
-::
-
- make or make package/frr/compile
-
-It may be possible that on first build ``make package/frr/compile`` not
-to work and it may be needed to run a ``make`` for the entire build
-envronment, add V=s for debugging
-
-Work with sources
------------------
-
-To update the rc1 version or add other options, the Makefile is found in
-feeds/routing/frr
-
-edit: PKG\_VERSION:= PKG\_SOURCE\_VERSION:=
-
-Usage
------
-
-Edit ``/usr/sbin/frr.init`` and add/remove the daemons name in section
-DAEMONS= or don't install unneded packages For example: zebra bgpd ldpd
-isisd nhrpd ospfd ospf6d pimd ripd ripngd
-
-Enable the serivce
-^^^^^^^^^^^^^^^^^^
-
-- service frr enable
-
-Start the service
-^^^^^^^^^^^^^^^^^
-
-- service frr start
diff --git a/doc/developer/building.rst b/doc/developer/building.rst
index 051611a65d..d145849f7f 100644
--- a/doc/developer/building.rst
+++ b/doc/developer/building.rst
@@ -7,7 +7,6 @@ Building FRR
.. toctree::
:maxdepth: 2
- building-frr-on-lede-openwrt
building-frr-on-alpine
building-frr-on-centos6
building-frr-on-centos7
@@ -21,6 +20,7 @@ Building FRR
building-frr-on-netbsd7
building-frr-on-omnios
building-frr-on-openbsd6
+ building-frr-for-openwrt
building-frr-on-ubuntu1204
building-frr-on-ubuntu1404
building-frr-on-ubuntu1604
diff --git a/doc/developer/subdir.am b/doc/developer/subdir.am
new file mode 100644
index 0000000000..43d1290044
--- /dev/null
+++ b/doc/developer/subdir.am
@@ -0,0 +1,72 @@
+#
+# doc/developer
+#
+
+dev_RSTFILES = \
+ doc/developer/bgp-typecodes.rst \
+ doc/developer/bgpd.rst \
+ doc/developer/building-frr-for-openwrt.rst \
+ doc/developer/building-frr-for-alpine.rst \
+ doc/developer/building-frr-for-centos6.rst \
+ doc/developer/building-frr-for-centos7.rst \
+ doc/developer/building-frr-for-debian8.rst \
+ doc/developer/building-frr-for-debian9.rst \
+ doc/developer/building-frr-for-fedora24.rst \
+ doc/developer/building-frr-for-freebsd10.rst \
+ doc/developer/building-frr-for-freebsd11.rst \
+ doc/developer/building-frr-for-freebsd9.rst \
+ doc/developer/building-frr-for-netbsd6.rst \
+ doc/developer/building-frr-for-netbsd7.rst \
+ doc/developer/building-frr-for-omnios.rst \
+ doc/developer/building-frr-for-openbsd6.rst \
+ doc/developer/building-frr-for-ubuntu1204.rst \
+ doc/developer/building-frr-for-ubuntu1404.rst \
+ doc/developer/building-frr-for-ubuntu1604.rst \
+ doc/developer/building-frr-for-ubuntu1804.rst \
+ doc/developer/building.rst \
+ doc/developer/cli.rst \
+ doc/developer/conf.py \
+ doc/developer/hooks.rst \
+ doc/developer/index.rst \
+ doc/developer/library.rst \
+ doc/developer/logging.rst \
+ doc/developer/maintainer-release-build.rst \
+ doc/developer/memtypes.rst \
+ doc/developer/modules.rst \
+ doc/developer/next-hop-tracking.rst \
+ doc/developer/ospf-api.rst \
+ doc/developer/ospf-sr.rst \
+ doc/developer/ospf.rst \
+ doc/developer/workflow.rst \
+ doc/developer/zebra.rst \
+ # end
+
+EXTRA_DIST += \
+ $(dev_RSTFILES) \
+ doc/developer/draft-zebra-00.ms \
+ doc/developer/ldpd-basic-test-setup.md \
+ # end
+
+DEVBUILD = doc/developer/_build
+$(DEVBUILD)/.doctrees/environment.pickle: $(dev_RSTFILES)
+
+#
+# nothing built automatically for "all" target.
+#
+
+#
+# standard targets
+#
+
+developer-info: $(DEVBUILD)/texinfo/frr.info
+developer-html: $(DEVBUILD)/html/.buildinfo
+developer-pdf: $(DEVBUILD)/latexpdf
+
+#
+# hook-in for clean
+#
+
+.PHONY: clean-devdocs
+clean-local: clean-devdocs
+clean-devdocs:
+ -rm -rf "$(DEVBUILD)"
diff --git a/doc/frr-sphinx.mk b/doc/frr-sphinx.mk
deleted file mode 100644
index 3e4c67d374..0000000000
--- a/doc/frr-sphinx.mk
+++ /dev/null
@@ -1,229 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# Sphinx is not designed to be invoked multiple times against the same toctree.
-.NOTPARALLEL:
-
-# You can set these variables from the command line.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-PAPER ?=
-BUILDDIR = _build
-
-# This is a custom FRR variable just for this docs subdirectory used to support
-# VPATH builds. Makefiles which include this file should override it to point
-# to the correct sources path.
-SOURCESDIR ?= .
-
-# User-friendly check for sphinx-build
-ifneq ($(MAKECMDGOALS), clean)
- ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
- SPHINXBUILD = sphinx-1.0-build
- endif
- ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
- $(error "The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD make variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/")
- endif
-endif
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCESDIR)
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCESDIR)
-
-.PHONY: help
-help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " applehelp to make an Apple Help Book"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " xml to make Docutils-native XML files"
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
- @echo " coverage to run coverage check of the documentation (if enabled)"
-
-.PHONY: clean
-clean:
- rm -rf $(BUILDDIR)/*
-
-.PHONY: html
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-.PHONY: dirhtml
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-.PHONY: singlehtml
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-.PHONY: pickle
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-.PHONY: json
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-.PHONY: htmlhelp
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-.PHONY: qthelp
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/FRR.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/FRR.qhc"
-
-.PHONY: applehelp
-applehelp:
- $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
- @echo
- @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
- @echo "N.B. You won't be able to view it unless you put it in" \
- "~/Library/Documentation/Help or install it in your application" \
- "bundle."
-
-.PHONY: devhelp
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/FRR"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/FRR"
- @echo "# devhelp"
-
-.PHONY: epub
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-.PHONY: latex
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-.PHONY: latexpdf
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: latexpdfja
-latexpdfja:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through platex and dvipdfmx..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: text
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-.PHONY: man
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-.PHONY: texinfo
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-.PHONY: info
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- $(MAKE) -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-.PHONY: gettext
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-.PHONY: changes
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-.PHONY: linkcheck
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-.PHONY: doctest
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
-
-.PHONY: coverage
-coverage:
- $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
- @echo "Testing of coverage in the sources finished, look at the " \
- "results in $(BUILDDIR)/coverage/python.txt."
-
-.PHONY: xml
-xml:
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
- @echo
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-.PHONY: pseudoxml
-pseudoxml:
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
- @echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/doc/manpages/Makefile b/doc/manpages/Makefile
new file mode 100644
index 0000000000..7cccfa2a3d
--- /dev/null
+++ b/doc/manpages/Makefile
@@ -0,0 +1,12 @@
+all: ALWAYS
+ @$(MAKE) -s -C ../.. doc/manpages/man.stamp
+help: ALWAYS
+ @$(MAKE) -s -C ../.. doc/help
+%: ALWAYS
+ @$(MAKE) -s -C ../.. doc/manpages/_build/$@
+
+Makefile:
+ #nothing
+ALWAYS:
+.PHONY: ALWAYS makefiles
+.SUFFIXES:
diff --git a/doc/manpages/Makefile.am b/doc/manpages/Makefile.am
deleted file mode 100644
index 009c723823..0000000000
--- a/doc/manpages/Makefile.am
+++ /dev/null
@@ -1,48 +0,0 @@
-# This is necessary to support VPATH builds.
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-# This variable is used as the documentation source location in frr-sphinx.mk
-SOURCESDIR = @srcdir@
-
-include @srcdir@/../frr-sphinx.mk
-
-# -----------------------------------------------------------------------------
-# Automake requires that 3rd-party Makefiles recognize these targets.
-# -----------------------------------------------------------------------------
-# install
-# install-data
-# install-exec
-# uninstall
-# install-dvi
-# install-html
-# install-info
-# install-ps
-# install-pdf
-# installdirs
-# check
-# installcheck
-# mostlyclean
-# clean
-# distclean
-# maintainer-clean
-# dvi
-# pdf
-# ps
-# info
-# html
-# tags
-# ctags
-
-# These targets are automatically generated by Sphinx but conflict with
-# implicitly defined Automake rules, so we manually override them to nothing.
-# The other option is deleting the Sphinx-generated rules, which suppresses the
-# warning but kinda screws up the symmetry between Makefiles.
-info: ;
-html: ;
-
-all: man
-
-install-data: man
-
-install: install-data
diff --git a/doc/manpages/subdir.am b/doc/manpages/subdir.am
new file mode 100644
index 0000000000..24f47fc7a5
--- /dev/null
+++ b/doc/manpages/subdir.am
@@ -0,0 +1,139 @@
+#
+# doc/manpages
+#
+
+man_RSTFILES = \
+ doc/manpages/bgpd.rst \
+ doc/manpages/common-options.rst \
+ doc/manpages/conf.py \
+ doc/manpages/defines.rst \
+ doc/manpages/eigrpd.rst \
+ doc/manpages/epilogue.rst \
+ doc/manpages/frr.rst \
+ doc/manpages/index.rst \
+ doc/manpages/isisd.rst \
+ doc/manpages/ldpd.rst \
+ doc/manpages/mtracebis.rst \
+ doc/manpages/nhrpd.rst \
+ doc/manpages/ospf6d.rst \
+ doc/manpages/ospfclient.rst \
+ doc/manpages/ospfd.rst \
+ doc/manpages/pimd.rst \
+ doc/manpages/ripd.rst \
+ doc/manpages/pbrd.rst \
+ doc/manpages/ripngd.rst \
+ doc/manpages/sharpd.rst \
+ doc/manpages/staticd.rst \
+ doc/manpages/vtysh.rst \
+ doc/manpages/watchfrr.rst \
+ doc/manpages/zebra.rst \
+ doc/manpages/bfdd.rst \
+ doc/manpages/bfd-options.rst \
+ # end
+
+EXTRA_DIST += $(man_RSTFILES)
+
+MANBUILD = doc/manpages/_build/man
+doc/manpages/_build/.doctrees/environment.pickle: $(man_RSTFILES)
+
+#
+# automake integration
+#
+
+rstman1dir = $(mandir)/man1
+rstman8dir = $(mandir)/man8
+
+rstman1_DATA =
+rstman8_DATA =
+
+rstman1_DATA += $(MANBUILD)/frr.1
+
+if PIMD
+rstman8_DATA += $(MANBUILD)/pimd.8
+rstman8_DATA += $(MANBUILD)/mtracebis.8
+endif
+
+if PBRD
+rstman8_DATA += $(MANBUILD)/pbrd.8
+endif
+
+if BGPD
+rstman8_DATA += $(MANBUILD)/bgpd.8
+endif
+
+if ISISD
+rstman8_DATA += $(MANBUILD)/isisd.8
+endif
+
+if OSPF6D
+rstman8_DATA += $(MANBUILD)/ospf6d.8
+endif
+
+if OSPFCLIENT
+rstman8_DATA += $(MANBUILD)/ospfclient.8
+endif
+
+if OSPFD
+rstman8_DATA += $(MANBUILD)/ospfd.8
+endif
+
+if LDPD
+rstman8_DATA += $(MANBUILD)/ldpd.8
+endif
+
+if RIPD
+rstman8_DATA += $(MANBUILD)/ripd.8
+endif
+
+if RIPNGD
+rstman8_DATA += $(MANBUILD)/ripngd.8
+endif
+
+if NHRPD
+rstman8_DATA += $(MANBUILD)/nhrpd.8
+endif
+
+if VTYSH
+rstman1_DATA += $(MANBUILD)/vtysh.1
+endif
+
+if WATCHFRR
+rstman8_DATA += $(MANBUILD)/watchfrr.8
+endif
+
+if ZEBRA
+rstman8_DATA += $(MANBUILD)/zebra.8
+endif
+
+if EIGRPD
+rstman8_DATA += $(MANBUILD)/eigrpd.8
+endif
+
+if SHARPD
+rstman8_DATA += $(MANBUILD)/sharpd.8
+endif
+
+if STATICD
+rstman8_DATA += $(MANBUILD)/staticd.8
+endif
+
+if BFDD
+rstman8_DATA += $(MANBUILD)/bfdd.8
+endif
+
+# dependency
+$(rstman8_DATA) $(rstman1_DATA): $(MANBUILD)/man.stamp
+
+#
+# hook-ins for clean / doc
+# (install is handled by automake _DATA)
+#
+
+clean-local: clean-manpages
+.PHONY: clean-manpages
+clean-manpages:
+ -rm -rf $(MANBUILD)
+
+doc: doc-man
+.PHONY: doc-man
+doc-man: $(rstman8_DATA) $(rstman1_DATA)
diff --git a/doc/subdir.am b/doc/subdir.am
new file mode 100644
index 0000000000..4170101655
--- /dev/null
+++ b/doc/subdir.am
@@ -0,0 +1,176 @@
+#
+# doc
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+PAPER ?=
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS)
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS)
+
+###
+
+AM_V_SPHINX = $(am__v_SPHINX_$(V))
+am__v_SPHINX_ = $(am__v_SPHINX_$(AM_DEFAULT_VERBOSITY))
+am__v_SPHINX_0 = @echo " SPHINX " $@;
+am__v_SPHINX_1 =
+AM_V_MAKEINFO = $(am__v_MAKEINFO_$(V))
+am__v_MAKEINFO_ = $(am__v_MAKEINFO_$(AM_DEFAULT_VERBOSITY))
+am__v_MAKEINFO_0 = @echo " MAKEINFO" $@;
+am__v_MAKEINFO_1 =
+
+#
+# real-file sphinx targets that work for dependencies
+#
+
+doc/%/_build/.doctrees/environment.pickle:
+ $(AM_V_SPHINX) ( \
+ subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
+ $(SPHINXBUILD) -a -q -b text -d "$${subdoc}/_build/.doctrees" \
+ $(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/text" \
+ )
+doc/%/_build/html/.buildinfo: doc/%/_build/.doctrees/environment.pickle
+ $(AM_V_SPHINX) ( \
+ subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
+ $(SPHINXBUILD) -q -b html -d "$${subdoc}/_build/.doctrees" \
+ $(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/html" \
+ )
+.PRECIOUS: doc/%/_build/texinfo/frr.texi
+doc/%/_build/texinfo/frr.texi: doc/%/_build/.doctrees/environment.pickle
+ $(AM_V_SPHINX) ( \
+ subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
+ $(SPHINXBUILD) -q -b texinfo -d "$${subdoc}/_build/.doctrees" \
+ $(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/texinfo" \
+ )
+doc/%/_build/texinfo/frr.info: doc/%/_build/texinfo/frr.texi
+ $(AM_V_MAKEINFO)$(MAKEINFO) --no-split -o '$@' '$<'
+doc/%/_build/man/man.stamp: doc/%/_build/.doctrees/environment.pickle
+ $(AM_V_SPHINX) ( \
+ subdoc="$@"; subdoc="$${subdoc#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
+ $(MKDIR_P) "$${subdoc}/_build/man"; touch $@.tmp; \
+ $(SPHINXBUILD) -a -q -b man -d "$${subdoc}/_build/.doctrees" \
+ $(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/man" && \
+ mv $@.tmp $@ \
+ )
+
+#
+# auxiliary sphinx targets (output name = directory,
+# deps will not work very well)
+#
+
+SPHINXTARGETS = \
+ html dirhtml singlehtml pickle json \
+ htmlhelp qthelp applehelp devhelp \
+ epub latex text man texinfo gettext \
+ changes linkcheck doctest coverage \
+ xml pseudoxml \
+ # end
+
+M_SPHINXTARGETS = $(addprefix doc/%/_build/,$(SPHINXTARGETS))
+.PRECIOUS: $(M_SPHINXTARGETS)
+$(M_SPHINXTARGETS): doc/%/_build/.doctrees/environment.pickle
+ $(AM_V_SPHINX) ( \
+ target="$@"; \
+ builder="$${target##*/}"; \
+ subdoc="$${target#doc/}"; subdoc="doc/$${subdoc%%/*}"; \
+ rm -rf "$@"; \
+ $(SPHINXBUILD) -q -b $${builder} -d $${subdoc}/_build/.doctrees \
+ $(ALLSPHINXOPTS) $(top_srcdir)/$${subdoc} $@ \
+ )
+
+.PHONY: doc/%/_build/latexpdf
+doc/%/_build/latexpdf: doc/%/_build/latex
+ @make -C $< all-pdf
+
+# If you want to build the developer's docs in other formats, try the
+# following:
+#
+# $ cd developer
+# $ make help
+
+# dist tarballs want doc sources
+EXTRA_DIST += \
+ doc/mpls/ChangeLog.opaque.txt \
+ doc/mpls/ospfd.conf \
+ doc/mpls/cli_summary.txt \
+ doc/mpls/opaque_lsa.txt \
+ doc/figures/cligraph.png \
+ doc/figures/cligraph.svg \
+ doc/figures/fig-normal-processing.dia \
+ doc/figures/fig-normal-processing.png \
+ doc/figures/fig-normal-processing.txt \
+ doc/figures/fig-rs-processing.dia \
+ doc/figures/fig-rs-processing.png \
+ doc/figures/fig-rs-processing.txt \
+ doc/figures/fig_topologies_full.dia \
+ doc/figures/fig_topologies_full.png \
+ doc/figures/fig_topologies_full.txt \
+ doc/figures/fig_topologies_rs.dia \
+ doc/figures/fig_topologies_rs.png \
+ doc/figures/fig_topologies_rs.txt \
+ doc/figures/fig-vnc-commercial-route-reflector.dia \
+ doc/figures/fig-vnc-commercial-route-reflector.png \
+ doc/figures/fig-vnc-commercial-route-reflector.txt \
+ doc/figures/fig-vnc-frr-route-reflector.dia \
+ doc/figures/fig-vnc-frr-route-reflector.png \
+ doc/figures/fig-vnc-frr-route-reflector.txt \
+ doc/figures/fig-vnc-gw.dia \
+ doc/figures/fig-vnc-gw.png \
+ doc/figures/fig-vnc-gw-rr.dia \
+ doc/figures/fig-vnc-gw-rr.png \
+ doc/figures/fig-vnc-gw-rr.txt \
+ doc/figures/fig-vnc-gw.txt \
+ doc/figures/fig-vnc-mesh.dia \
+ doc/figures/fig-vnc-mesh.png \
+ doc/figures/fig-vnc-mesh.txt \
+ doc/figures/fig-vnc-redundant-route-reflectors.dia \
+ doc/figures/fig-vnc-redundant-route-reflectors.png \
+ doc/figures/fig-vnc-redundant-route-reflectors.txt \
+ doc/figures/frr-icon.svg \
+ doc/figures/frr-logo-icon.png \
+ doc/figures/frr-logo-medium.png \
+ doc/figures/frr-logo.png \
+ doc/figures/frr-logo-small.png \
+ doc/figures/git_branches.png \
+ doc/figures/git_branches.svg \
+ doc/figures/ospf_api_architecture.png \
+ doc/figures/ospf_api_msghdr.png \
+ doc/figures/ospf_api_msgs1.png \
+ doc/figures/ospf_api_msgs2.png \
+ doc/extra/frrlexer.py \
+ # end
+
+
+.PHONY: doc/help
+doc/help:
+ @echo "Please use \`make doc/{user,manpages,developer}/<target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " applehelp to make an Apple Help Book"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " texinfo to make Texinfo files"
+ @echo " info to make Texinfo files and run them through makeinfo"
+ @echo " gettext to make PO message catalogs"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " xml to make Docutils-native XML files"
+ @echo " pseudoxml to make pseudoxml-XML files for display purposes"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+ @echo " coverage to run coverage check of the documentation (if enabled)"
diff --git a/doc/user/Makefile b/doc/user/Makefile
new file mode 100644
index 0000000000..840ee5b8a9
--- /dev/null
+++ b/doc/user/Makefile
@@ -0,0 +1,16 @@
+all: ALWAYS
+ @$(MAKE) -s -C ../.. doc-user
+help: ALWAYS
+ @$(MAKE) -s -C ../.. doc/help
+pdf: ALWAYS
+ @$(MAKE) -s -C ../.. doc/user/_build/latexpdf
+info: ALWAYS
+ @$(MAKE) -s -C ../.. doc/user/_build/texinfo/frr.info
+%: ALWAYS
+ @$(MAKE) -s -C ../.. doc/user/_build/$@
+
+Makefile:
+ #nothing
+ALWAYS:
+.PHONY: ALWAYS makefiles
+.SUFFIXES:
diff --git a/doc/user/Makefile.am b/doc/user/Makefile.am
deleted file mode 100644
index 64af2ff145..0000000000
--- a/doc/user/Makefile.am
+++ /dev/null
@@ -1,55 +0,0 @@
-# This is necessary to support VPATH builds.
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-# This variable is used as the documentation source location in frr-sphinx.mk
-SOURCESDIR = @srcdir@
-
-include @srcdir@/../frr-sphinx.mk
-
-# -----------------------------------------------------------------------------
-# Automake requires that 3rd-party Makefiles recognize these targets.
-# -----------------------------------------------------------------------------
-# install
-# install-data
-# install-exec
-# uninstall
-# install-dvi
-# install-html
-# install-info
-# install-ps
-# install-pdf
-# installdirs
-# check
-# installcheck
-# mostlyclean
-# clean
-# distclean
-# maintainer-clean
-# dvi
-# pdf
-# ps
-# info
-# html
-# tags
-# ctags
-
-# When building 'all', the logic is that we want to make docs that are easily
-# readable by the person that just built them. Technically the reST source is
-# readable in its own right, but we'll also build info and html because those
-# offer sequentially better reading experiences. PDF is not built by default
-# because it takes quite a while.
-all: info
-
-# info and html already have built-in sphinx rules; pdf goes to latexpdf
-pdf: latexpdf
-
-# install user manual as info file
-install-info: info
- install -d ${DESTDIR}${infodir}
- gzip < _build/texinfo/frr.info > ${DESTDIR}${infodir}/frr.info.gz
- install-info _build/texinfo/frr.info ${DESTDIR}${infodir}/dir
-
-install-data: install-info
-
-install: install-data
diff --git a/doc/user/_static/overrides.css b/doc/user/_static/overrides.css
index 3143f8bb65..41fcc66f8d 100644
--- a/doc/user/_static/overrides.css
+++ b/doc/user/_static/overrides.css
@@ -19,11 +19,6 @@ table.mark th {
table.mark td {
vertical-align: middle;
}
-table.mark td[colspan="7"] {
- text-align: center;
- padding-top: 8pt;
- padding-bottom: 2pt;
-}
table.mark cite {
font-weight: bold;
}
@@ -32,6 +27,13 @@ table.mark cite {
td.mark {
width: 4.5em;
}
+table.mark strong {
+ display:block;
+ text-align: center;
+ margin:auto;
+ padding-top: 8pt;
+ padding-bottom: 2pt;
+}
td.mark span {
display: block;
padding: 3px 1px;
@@ -39,6 +41,12 @@ td.mark span {
width: 36pt;
margin:auto;
}
+table.mark tr td:first-child {
+ padding-left:1.5em;
+}
+table.mark tr td:first-child cite {
+ margin-left:-1.5em;
+}
span.mark-y { background-color: #77ffaa; }
span.mark-geq { background-color: #aaff77; }
span.mark-cp { background-color: #ffbb55; }
diff --git a/doc/user/overview.rst b/doc/user/overview.rst
index 51bd6228e3..e90b84b02b 100644
--- a/doc/user/overview.rst
+++ b/doc/user/overview.rst
@@ -166,69 +166,69 @@ features with system dependencies are included here.
will look somewhat shoddy on other sphinx targets like PDF or info (but
should still be readable.)
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
| Daemon / Feature | Linux | OpenBSD | FreeBSD | NetBSD | Solaris |
-+==+================================+================+==============+============+============+============+
-| FRR Core |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++===================================+================+==============+============+============+============+
+| **FRR Core** | | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `zebra` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | VRF | :mark:`≥4.8` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | MPLS | :mark:`≥4.5` | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| VRF | :mark:`≥4.8` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| MPLS | :mark:`≥4.5` | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `pbrd` (Policy Routing) | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| WAN / Carrier protocols |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| **WAN / Carrier protocols** | | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `bgpd` (BGP) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | VRF / L3VPN | :mark:`≥4.8` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
-| | | :mark:`†4.3` | | | | |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | EVPN | :mark:`≥4.18` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
-| | | :mark:`†4.9` | | | | |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | VNC (Virtual Network Control) | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | Flowspec | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| VRF / L3VPN | :mark:`≥4.8` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
+| | :mark:`†4.3` | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| EVPN | :mark:`≥4.18` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
+| | :mark:`†4.9` | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| VNC (Virtual Network Control) | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| Flowspec | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` | :mark:`CP` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `ldpd` (LDP) | :mark:`≥4.5` | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | VPWS / PW | :mark:`N` | :mark:`≥5.8` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | VPLS | :mark:`N` | :mark:`≥5.8` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| VPWS / PW | :mark:`N` | :mark:`≥5.8` | :mark:`N` | :mark:`N` | :mark:`N` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| VPLS | :mark:`N` | :mark:`≥5.8` | :mark:`N` | :mark:`N` | :mark:`N` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `nhrpd` (NHRP) | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| Link-State Routing |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| **Link-State Routing** | | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `ospfd` (OSPFv2) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | Segment Routing | :mark:`≥4.12` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| Segment Routing | :mark:`≥4.12` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `ospf6d` (OSPFv3) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `isisd` (IS-IS) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| Distance-Vector Routing |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| **Distance-Vector Routing** | | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `ripd` (RIPv2) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `ripngd` (RIPng) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `babeld` (BABEL) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `eigrpd` (EIGRP) | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| Multicast Routing |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| **Multicast Routing** | | | | | |
++-----------------------------------+----------------+--------------+------------+------------+------------+
| `pimd` (PIM) | :mark:`≥4.18` | :mark:`N` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | SSM (Source Specific) | :mark:`Y` | :mark:`N` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
-| | ASM (Any Source) | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
-+--+--------------------------------+----------------+--------------+------------+------------+------------+
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| SSM (Source Specific) | :mark:`Y` | :mark:`N` | :mark:`Y` | :mark:`Y` | :mark:`Y` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
+| ASM (Any Source) | :mark:`Y` | :mark:`N` | :mark:`N` | :mark:`N` | :mark:`N` |
++-----------------------------------+----------------+--------------+------------+------------+------------+
The indicators have the following semantics:
diff --git a/doc/user/subdir.am b/doc/user/subdir.am
new file mode 100644
index 0000000000..6e51eed9d1
--- /dev/null
+++ b/doc/user/subdir.am
@@ -0,0 +1,110 @@
+#
+# doc/user
+#
+
+user_RSTFILES = \
+ doc/user/babeld.rst \
+ doc/user/ldpd.rst \
+ doc/user/basic.rst \
+ doc/user/bgp.rst \
+ doc/user/bugs.rst \
+ doc/user/conf.py \
+ doc/user/eigrpd.rst \
+ doc/user/filter.rst \
+ doc/user/glossary.rst \
+ doc/user/index.rst \
+ doc/user/installation.rst \
+ doc/user/ipv6.rst \
+ doc/user/isisd.rst \
+ doc/user/kernel.rst \
+ doc/user/nhrpd.rst \
+ doc/user/ospf6d.rst \
+ doc/user/ospfd.rst \
+ doc/user/ospf_fundamentals.rst \
+ doc/user/overview.rst \
+ doc/user/packet-dumps.rst \
+ doc/user/pim.rst \
+ doc/user/ripd.rst \
+ doc/user/pbr.rst \
+ doc/user/ripngd.rst \
+ doc/user/routemap.rst \
+ doc/user/routeserver.rst \
+ doc/user/rpki.rst \
+ doc/user/setup.rst \
+ doc/user/sharp.rst \
+ doc/user/snmp.rst \
+ doc/user/snmptrap.rst \
+ doc/user/static.rst \
+ doc/user/vnc.rst \
+ doc/user/vtysh.rst \
+ doc/user/zebra.rst \
+ doc/user/bfd.rst \
+ doc/user/flowspec.rst \
+ # end
+
+EXTRA_DIST += \
+ $(user_RSTFILES) \
+ doc/user/Useful_Sysctl_Settings.md \
+ # end
+
+USERBUILD = doc/user/_build
+$(USERBUILD)/.doctrees/environment.pickle: $(user_RSTFILES)
+
+#
+# automake integration (things that should be built in "all")
+#
+
+if DOC
+nodist_noinst_DATA += $(USERBUILD)/texinfo/frr.info
+endif
+if DOC_HTML
+nodist_noinst_DATA += $(USERBUILD)/html/.buildinfo
+endif
+
+#
+# standard targets
+#
+
+.PHONY: info html pdf
+info: $(USERBUILD)/texinfo/frr.info
+html: $(USERBUILD)/html/.buildinfo
+pdf: $(USERBUILD)/latexpdf
+
+#
+# hook-ins for clean / install / doc
+#
+
+.PHONY: clean-userdocs
+clean-local: clean-userdocs
+clean-userdocs:
+ -rm -rf "$(USERBUILD)"
+
+# INSTALL_INFO=install-info
+.PHONY: install-info uninstall-info install-html uninstall-html
+
+install-info: $(USERBUILD)/texinfo/frr.info
+ $(MKDIR_P) "$(DESTDIR)$(infodir)"
+ $(INSTALL_DATA) "$<" "$(DESTDIR)$(infodir)"
+ [ -z "${DESTDIR}" ] && $(INSTALL_INFO) --info-dir="$(DESTDIR)$(infodir)" "$<" || true
+uninstall-info: $(USERBUILD)/texinfo/frr.info
+ -rm -f "$(DESTDIR)$(infodir)/$<"
+ [ -z "${DESTDIR}" ] && $(INSTALL_INFO) --delete --info-dir="$(DESTDIR)$(infodir)" "$<" || true
+
+install-html: $(USERBUILD)/html/.buildinfo
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)"
+ cp -r "$(USERBUILD)/html" "$(DESTDIR)$(htmldir)"
+uninstall-html:
+ -rm -rf "$(DESTDIR)$(htmldir)/html"
+
+.PHONY: install-data-local uninstall-local
+if DOC
+DOC_INFO=info
+install-data-local: install-info
+uninstall-local: uninstall-info
+endif
+if DOC_HTML
+DOC_HTML=html
+install-data-local: install-html
+uninstall-local: uninstall-html
+endif
+doc: $(DOC_INFO) $(DOC_HTML)
diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst
index 85f2a7af3e..e3e5d1325a 100644
--- a/doc/user/zebra.rst
+++ b/doc/user/zebra.rst
@@ -395,8 +395,6 @@ be updated with the new name. To illustrate, if you want to recompile with
./configure --with-defaultvrfname=global
-More information about the option in :ref:`_frr-configuration`.
-
.. _zebra-mpls:
MPLS Commands
diff --git a/lib/agg_table.c b/lib/agg_table.c
new file mode 100644
index 0000000000..6033fc3f05
--- /dev/null
+++ b/lib/agg_table.c
@@ -0,0 +1,59 @@
+/*
+ * Aggregate Route
+ * Copyright (C) 2018 Cumulus Networks, Inc.
+ * Donald Sharp
+ *
+ * FRR 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.
+ *
+ * FRR 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 this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "zebra.h"
+
+#include "agg_table.h"
+
+
+static struct route_node *agg_node_create(route_table_delegate_t *delegate,
+ struct route_table *table)
+{
+ struct agg_node *node;
+
+ node = XCALLOC(MTYPE_TMP, sizeof(struct agg_node));
+
+ return agg_node_to_rnode(node);
+}
+
+static void agg_node_destroy(route_table_delegate_t *delegate,
+ struct route_table *table, struct route_node *node)
+
+{
+ struct agg_node *anode = agg_node_from_rnode(node);
+
+ XFREE(MTYPE_TMP, anode);
+}
+
+route_table_delegate_t agg_table_delegate = {
+ .create_node = agg_node_create,
+ .destroy_node = agg_node_destroy,
+};
+
+struct agg_table *agg_table_init(void)
+{
+ struct agg_table *at;
+
+ at = XCALLOC(MTYPE_TMP, sizeof(struct agg_table));
+
+ at->route_table = route_table_init_with_delegate(&agg_table_delegate);
+ at->route_table->info = at;
+
+ return at;
+}
diff --git a/lib/agg_table.h b/lib/agg_table.h
new file mode 100644
index 0000000000..235f0d37a3
--- /dev/null
+++ b/lib/agg_table.h
@@ -0,0 +1,153 @@
+/*
+ * agg_table - Aggregate Table Header
+ * Copyright (C) 2018 Cumulus Networks, Inc.
+ * Donald Sharp
+ *
+ * FRR 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.
+ *
+ * FRR 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 this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef __AGG_TABLE_H__
+#define __AGG_TABLE_H__
+
+#include "prefix.h"
+#include "table.h"
+
+struct agg_table {
+ struct route_table *route_table;
+
+ void *info;
+};
+
+struct agg_node {
+ /*
+ * Caution these must be the very first fields
+ * @see agg_node_to_rnode
+ * @see agg_node_from_rnode
+ */
+ ROUTE_NODE_FIELDS
+
+ /* Aggregation. */
+ void *aggregate;
+};
+
+static inline struct route_node *agg_node_to_rnode(struct agg_node *node)
+{
+ return (struct route_node *)node;
+}
+
+static inline struct agg_node *agg_node_from_rnode(struct route_node *node)
+{
+ return (struct agg_node *)node;
+}
+
+static inline struct agg_node *agg_lock_node(struct agg_node *node)
+{
+ return (struct agg_node *)route_lock_node(agg_node_to_rnode(node));
+}
+
+static inline void agg_unlock_node(struct agg_node *node)
+{
+ return route_unlock_node(agg_node_to_rnode(node));
+}
+
+static inline void agg_set_table_info(struct agg_table *atable, void *data)
+{
+ atable->info = data;
+}
+
+static inline void *agg_get_table_info(struct agg_table *atable)
+{
+ return atable->info;
+}
+
+static inline struct agg_node *agg_route_top(struct agg_table *table)
+{
+ return agg_node_from_rnode(route_top(table->route_table));
+}
+
+static inline struct agg_node *agg_route_next(struct agg_node *node)
+{
+ return agg_node_from_rnode(route_next(agg_node_to_rnode(node)));
+}
+
+static inline struct agg_node *agg_node_get(struct agg_table *table,
+ struct prefix *p)
+{
+ return agg_node_from_rnode(route_node_get(table->route_table, p));
+}
+
+static inline struct agg_node *
+agg_node_lookup(const struct agg_table *const table, struct prefix *p)
+{
+ return agg_node_from_rnode(route_node_lookup(table->route_table, p));
+}
+
+static inline struct agg_node *agg_route_next_until(struct agg_node *node,
+ struct agg_node *limit)
+{
+ struct route_node *rnode;
+
+ rnode = route_next_until(agg_node_to_rnode(node),
+ agg_node_to_rnode(limit));
+
+ return agg_node_from_rnode(rnode);
+}
+
+static inline struct agg_node *agg_node_match(struct agg_table *table,
+ struct prefix *p)
+{
+ return agg_node_from_rnode(route_node_match(table->route_table, p));
+}
+
+static inline struct agg_node *agg_node_parent(struct agg_node *node)
+{
+ struct route_node *rn = agg_node_to_rnode(node);
+
+ return agg_node_from_rnode(rn->parent);
+}
+
+static inline struct agg_node *agg_node_left(struct agg_node *node)
+{
+ struct route_node *rn = agg_node_to_rnode(node);
+
+ return agg_node_from_rnode(rn->l_left);
+}
+
+static inline struct agg_node *agg_node_right(struct agg_node *node)
+{
+ struct route_node *rn = agg_node_to_rnode(node);
+
+ return agg_node_from_rnode(rn->l_right);
+}
+
+extern struct agg_table *agg_table_init(void);
+
+static inline void agg_table_finish(struct agg_table *atable)
+{
+ route_table_finish(atable->route_table);
+ atable->route_table = NULL;
+
+ XFREE(MTYPE_TMP, atable);
+}
+
+static inline struct agg_node *agg_route_table_top(struct agg_node *node)
+{
+ return (struct agg_node *)route_top(node->table);
+}
+
+static inline struct agg_table *agg_get_table(struct agg_node *node)
+{
+ return (struct agg_table *)node->table->info;
+}
+#endif
diff --git a/lib/bfd.c b/lib/bfd.c
index 0eddb47514..1dfe583caf 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -342,7 +342,7 @@ static void bfd_last_update(time_t last_update, char *buf, size_t len)
* bfd_show_param - Show the BFD parameter information.
*/
void bfd_show_param(struct vty *vty, struct bfd_info *bfd_info, int bfd_tag,
- int extra_space, uint8_t use_json, json_object *json_obj)
+ int extra_space, bool use_json, json_object *json_obj)
{
json_object *json_bfd = NULL;
@@ -378,7 +378,7 @@ void bfd_show_param(struct vty *vty, struct bfd_info *bfd_info, int bfd_tag,
* bfd_show_status - Show the BFD status information.
*/
static void bfd_show_status(struct vty *vty, struct bfd_info *bfd_info,
- int bfd_tag, int extra_space, uint8_t use_json,
+ int bfd_tag, int extra_space, bool use_json,
json_object *json_bfd)
{
char time_buf[32];
@@ -402,7 +402,7 @@ static void bfd_show_status(struct vty *vty, struct bfd_info *bfd_info,
* bfd_show_info - Show the BFD information.
*/
void bfd_show_info(struct vty *vty, struct bfd_info *bfd_info, int multihop,
- int extra_space, uint8_t use_json, json_object *json_obj)
+ int extra_space, bool use_json, json_object *json_obj)
{
json_object *json_bfd = NULL;
diff --git a/lib/bfd.h b/lib/bfd.h
index f824b0fd9b..b1e490a622 100644
--- a/lib/bfd.h
+++ b/lib/bfd.h
@@ -91,11 +91,11 @@ extern struct interface *bfd_get_peer_info(struct stream *s, struct prefix *dp,
const char *bfd_get_status_str(int status);
extern void bfd_show_param(struct vty *vty, struct bfd_info *bfd_info,
- int bfd_tag, int extra_space, uint8_t use_json,
+ int bfd_tag, int extra_space, bool use_json,
json_object *json_obj);
extern void bfd_show_info(struct vty *vty, struct bfd_info *bfd_info,
- int multihop, int extra_space, uint8_t use_json,
+ int multihop, int extra_space, bool use_json,
json_object *json_obj);
extern void bfd_client_sendmsg(struct zclient *zclient, int command);
diff --git a/lib/frr_pthread.c b/lib/frr_pthread.c
index f5a6383f48..c0aae5e52e 100644
--- a/lib/frr_pthread.c
+++ b/lib/frr_pthread.c
@@ -85,7 +85,7 @@ void frr_pthread_finish()
}
struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr,
- const char *name)
+ const char *name, const char *os_name)
{
static struct frr_pthread holder = {};
struct frr_pthread *fpt = NULL;
@@ -107,6 +107,9 @@ struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr,
fpt->attr = *attr;
name = (name ? name : "Anonymous thread");
fpt->name = XSTRDUP(MTYPE_FRR_PTHREAD, name);
+ if (os_name)
+ snprintf(fpt->os_name, OS_THREAD_NAMELEN,
+ "%s", os_name);
if (attr == &frr_pthread_attr_default)
fpt->attr.id = frr_pthread_get_id();
/* initialize startup synchronization primitives */
@@ -140,16 +143,34 @@ void frr_pthread_destroy(struct frr_pthread *fpt)
XFREE(MTYPE_FRR_PTHREAD, fpt);
}
-void frr_pthread_set_name(struct frr_pthread *fpt, const char *name)
+int frr_pthread_set_name(struct frr_pthread *fpt, const char *name,
+ const char *os_name)
{
- pthread_mutex_lock(&fpt->mtx);
- {
- if (fpt->name)
- XFREE(MTYPE_FRR_PTHREAD, fpt->name);
- fpt->name = XSTRDUP(MTYPE_FRR_PTHREAD, name);
+ int ret = 0;
+
+ if (name) {
+ pthread_mutex_lock(&fpt->mtx);
+ {
+ if (fpt->name)
+ XFREE(MTYPE_FRR_PTHREAD, fpt->name);
+ fpt->name = XSTRDUP(MTYPE_FRR_PTHREAD, name);
+ }
+ pthread_mutex_unlock(&fpt->mtx);
+ thread_master_set_name(fpt->master, name);
}
- pthread_mutex_unlock(&fpt->mtx);
- thread_master_set_name(fpt->master, name);
+
+ if (os_name) {
+ pthread_mutex_lock(&fpt->mtx);
+ snprintf(fpt->os_name, OS_THREAD_NAMELEN, "%s", os_name);
+ pthread_mutex_unlock(&fpt->mtx);
+#ifdef GNU_LINUX
+ ret = pthread_setname_np(fpt->thread, fpt->os_name);
+#elif defined(OPEN_BSD)
+ ret = pthread_set_name_np(fpt->thread, fpt->os_name);
+#endif
+ }
+
+ return ret;
}
struct frr_pthread *frr_pthread_get(uint32_t id)
@@ -311,6 +332,9 @@ static void *fpt_run(void *arg)
fpt->master->handle_signals = false;
+ if (fpt->os_name[0])
+ frr_pthread_set_name(fpt, NULL, fpt->os_name);
+
frr_pthread_notify_running(fpt);
struct thread task;
diff --git a/lib/frr_pthread.h b/lib/frr_pthread.h
index 91002dd8ef..cc4fc74337 100644
--- a/lib/frr_pthread.h
+++ b/lib/frr_pthread.h
@@ -28,6 +28,8 @@
DECLARE_MTYPE(FRR_PTHREAD);
DECLARE_MTYPE(PTHREAD_PRIM);
+#define OS_THREAD_NAMELEN 16
+
struct frr_pthread;
struct frr_pthread_attr;
@@ -89,6 +91,9 @@ struct frr_pthread {
* Requires: mtx
*/
char *name;
+
+ /* Used in pthread_set_name max 16 characters */
+ char os_name[OS_THREAD_NAMELEN];
};
extern struct frr_pthread_attr frr_pthread_attr_default;
@@ -122,18 +127,23 @@ void frr_pthread_finish(void);
*
* @param attr - the thread attributes
* @param name - Human-readable name
+ * @param os_name - 16 characters (including '\0') thread name to set in os,
* @return the created frr_pthread upon success, or NULL upon failure
*/
struct frr_pthread *frr_pthread_new(struct frr_pthread_attr *attr,
- const char *name);
+ const char *name, const char *os_name);
/*
* Changes the name of the frr_pthread.
*
* @param fpt - the frr_pthread to operate on
* @param name - Human-readable name
+ * @param os_name - 16 characters thread name , including the null
+ * terminator ('\0') to set in os.
+ * @return - on success returns 0 otherwise nonzero error number.
*/
-void frr_pthread_set_name(struct frr_pthread *fpt, const char *name);
+int frr_pthread_set_name(struct frr_pthread *fpt, const char *name,
+ const char *os_name);
/*
* Destroys an frr_pthread.
diff --git a/lib/frratomic.h b/lib/frratomic.h
index 113f46c075..1f1d1b569a 100644
--- a/lib/frratomic.h
+++ b/lib/frratomic.h
@@ -29,6 +29,12 @@
#ifdef HAVE_STDATOMIC_H
#include <stdatomic.h>
+/* These are available in gcc, but not in stdatomic */
+#define atomic_add_fetch_explicit __atomic_add_fetch
+#define atomic_sub_fetch_explicit __atomic_sub_fetch
+#define atomic_and_fetch_explicit __atomic_and_fetch
+#define atomic_or_fetch_explicit __atomic_or_fetch
+
/* gcc 4.7 and newer */
#elif defined(HAVE___ATOMIC)
diff --git a/lib/json.c b/lib/json.c
index 40b6aadaa3..4ea20ba178 100644
--- a/lib/json.c
+++ b/lib/json.c
@@ -28,15 +28,15 @@
* is the *last* keyword on the line no matter
* what.
*/
-int use_json(const int argc, struct cmd_token *argv[])
+bool use_json(const int argc, struct cmd_token *argv[])
{
if (argc == 0)
- return 0;
+ return false;
if (argv[argc - 1]->arg && strmatch(argv[argc - 1]->text, "json"))
- return 1;
+ return true;
- return 0;
+ return false;
}
void json_object_string_add(struct json_object *obj, const char *key,
diff --git a/lib/json.h b/lib/json.h
index 788d1d6efa..d349162304 100644
--- a/lib/json.h
+++ b/lib/json.h
@@ -52,7 +52,7 @@ extern int json_object_object_get_ex(struct json_object *obj, const char *key,
#include "command.h"
-extern int use_json(const int argc, struct cmd_token *argv[]);
+extern bool use_json(const int argc, struct cmd_token *argv[]);
extern void json_object_string_add(struct json_object *obj, const char *key,
const char *s);
extern void json_object_int_add(struct json_object *obj, const char *key,
diff --git a/lib/log.c b/lib/log.c
index b067018e08..010b984786 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -925,7 +925,6 @@ static const struct zebra_desc_table command_types[] = {
DESC_ENTRY(ZEBRA_IMPORT_ROUTE_REGISTER),
DESC_ENTRY(ZEBRA_IMPORT_ROUTE_UNREGISTER),
DESC_ENTRY(ZEBRA_IMPORT_CHECK_UPDATE),
- DESC_ENTRY(ZEBRA_IPV4_ROUTE_IPV6_NEXTHOP_ADD),
DESC_ENTRY(ZEBRA_BFD_DEST_REGISTER),
DESC_ENTRY(ZEBRA_BFD_DEST_DEREGISTER),
DESC_ENTRY(ZEBRA_BFD_DEST_UPDATE),
diff --git a/lib/memory.c b/lib/memory.c
index 87cba69fc5..695bbfe115 100644
--- a/lib/memory.c
+++ b/lib/memory.c
@@ -36,9 +36,19 @@ DEFINE_MTYPE(LIB, PREFIX_FLOWSPEC, "Prefix Flowspec")
static inline void mt_count_alloc(struct memtype *mt, size_t size, void *ptr)
{
+ size_t current;
size_t oldsize;
- atomic_fetch_add_explicit(&mt->n_alloc, 1, memory_order_relaxed);
+ current = 1 + atomic_fetch_add_explicit(&mt->n_alloc, 1,
+ memory_order_relaxed);
+
+ oldsize = atomic_load_explicit(&mt->n_max, memory_order_relaxed);
+ if (current > oldsize)
+ /* note that this may fail, but approximation is sufficient */
+ atomic_compare_exchange_weak_explicit(&mt->n_max, &oldsize,
+ current,
+ memory_order_relaxed,
+ memory_order_relaxed);
oldsize = atomic_load_explicit(&mt->size, memory_order_relaxed);
if (oldsize == 0)
@@ -51,7 +61,15 @@ static inline void mt_count_alloc(struct memtype *mt, size_t size, void *ptr)
#ifdef HAVE_MALLOC_USABLE_SIZE
size_t mallocsz = malloc_usable_size(ptr);
- atomic_fetch_add_explicit(&mt->total, mallocsz, memory_order_relaxed);
+ current = mallocsz + atomic_fetch_add_explicit(&mt->total, mallocsz,
+ memory_order_relaxed);
+ oldsize = atomic_load_explicit(&mt->max_size, memory_order_relaxed);
+ if (current > oldsize)
+ /* note that this may fail, but approximation is sufficient */
+ atomic_compare_exchange_weak_explicit(&mt->max_size, &oldsize,
+ current,
+ memory_order_relaxed,
+ memory_order_relaxed);
#endif
}
diff --git a/lib/memory.h b/lib/memory.h
index c39f34e3a7..2d6c144778 100644
--- a/lib/memory.h
+++ b/lib/memory.h
@@ -34,9 +34,11 @@ struct memtype {
struct memtype *next, **ref;
const char *name;
_Atomic size_t n_alloc;
+ _Atomic size_t n_max;
_Atomic size_t size;
#ifdef HAVE_MALLOC_USABLE_SIZE
_Atomic size_t total;
+ _Atomic size_t max_size;
#endif
};
diff --git a/lib/memory_vty.c b/lib/memory_vty.c
index 9ee2e52ec7..73a18529a2 100644
--- a/lib/memory_vty.c
+++ b/lib/memory_vty.c
@@ -73,27 +73,45 @@ static int show_memory_mallinfo(struct vty *vty)
static int qmem_walker(void *arg, struct memgroup *mg, struct memtype *mt)
{
struct vty *vty = arg;
- if (!mt)
+ if (!mt) {
vty_out(vty, "--- qmem %s ---\n", mg->name);
- else {
+ vty_out(vty, "%-30s: %8s %-8s%s %8s %9s\n",
+ "Type", "Current#", " Size",
+#ifdef HAVE_MALLOC_USABLE_SIZE
+ " Total",
+#else
+ "",
+#endif
+ "Max#",
+#ifdef HAVE_MALLOC_USABLE_SIZE
+ "MaxBytes"
+#else
+ ""
+#endif
+ );
+ } else {
if (mt->n_alloc != 0) {
char size[32];
snprintf(size, sizeof(size), "%6zu", mt->size);
-
#ifdef HAVE_MALLOC_USABLE_SIZE
#define TSTR " %9zu"
#define TARG , mt->total
+#define TARG2 , mt->max_size
#else
#define TSTR ""
#define TARG
+#define TARG2
#endif
- vty_out(vty, "%-30s: %10zu %-16s"TSTR"\n", mt->name,
+ vty_out(vty, "%-30s: %8zu %-8s"TSTR" %8zu"TSTR"\n",
+ mt->name,
mt->n_alloc,
mt->size == 0 ? ""
: mt->size == SIZE_VAR
- ? "(variably sized)"
+ ? "variable"
: size
- TARG);
+ TARG,
+ mt->n_max
+ TARG2);
}
}
return 0;
diff --git a/lib/netns_linux.c b/lib/netns_linux.c
index b8eaa72c22..33338ac89c 100644
--- a/lib/netns_linux.c
+++ b/lib/netns_linux.c
@@ -468,21 +468,12 @@ void ns_init(void)
if (ns_initialised == 1)
return;
errno = 0;
-#ifdef HAVE_NETNS
- if (have_netns_enabled < 0) {
+ if (have_netns())
ns_default_ns_fd = open(NS_DEFAULT_NAME, O_RDONLY);
- if (ns_default_ns_fd == -1)
- flog_err(LIB_ERR_NS,
- "NS initialization failure %d(%s)", errno,
- safe_strerror(errno));
- } else {
+ else {
ns_default_ns_fd = -1;
default_ns = NULL;
}
-#else
- ns_default_ns_fd = -1;
- default_ns = NULL;
-#endif /* HAVE_NETNS */
ns_current_ns_fd = -1;
ns_initialised = 1;
}
diff --git a/lib/plist.c b/lib/plist.c
index 2b666f256f..5746080127 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -396,7 +396,7 @@ static int64_t prefix_new_seq_get(struct prefix_list *plist)
newseq = ((maxseq / 5) * 5) + 5;
- return newseq;
+ return (newseq > UINT_MAX) ? UINT_MAX : newseq;
}
/* Return prefix list entry which has same seq number. */
@@ -1900,7 +1900,7 @@ void prefix_bgp_orf_remove_all(afi_t afi, char *name)
/* return prefix count */
int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
- uint8_t use_json)
+ bool use_json)
{
struct prefix_list *plist;
struct prefix_list_entry *pentry;
diff --git a/lib/plist.h b/lib/plist.h
index fecbe0e2ce..8a4fa8d3ce 100644
--- a/lib/plist.h
+++ b/lib/plist.h
@@ -72,6 +72,7 @@ extern struct stream *prefix_bgp_orf_entry(struct stream *,
uint8_t, uint8_t);
extern int prefix_bgp_orf_set(char *, afi_t, struct orf_prefix *, int, int);
extern void prefix_bgp_orf_remove_all(afi_t, char *);
-extern int prefix_bgp_show_prefix_list(struct vty *, afi_t, char *, uint8_t);
+extern int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
+ bool use_json);
#endif /* _QUAGGA_PLIST_H */
diff --git a/lib/routemap.c b/lib/routemap.c
index 4125bb53ae..e5613c2081 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -891,6 +891,14 @@ static void vty_show_route_map_entry(struct vty *vty, struct route_map *map)
}
}
+static int sort_route_map(const void **map1, const void **map2)
+{
+ const struct route_map *m1 = *map1;
+ const struct route_map *m2 = *map2;
+
+ return strcmp(m1->name, m2->name);
+}
+
static int vty_show_route_map(struct vty *vty, const char *name)
{
struct route_map *map;
@@ -907,9 +915,19 @@ static int vty_show_route_map(struct vty *vty, const char *name)
return CMD_SUCCESS;
}
} else {
+
+ struct list *maplist = list_new();
+ struct listnode *ln;
+
for (map = route_map_master.head; map; map = map->next)
- if (!map->deleted)
- vty_show_route_map_entry(vty, map);
+ listnode_add(maplist, map);
+
+ list_sort(maplist, sort_route_map);
+
+ for (ALL_LIST_ELEMENTS_RO(maplist, ln, map))
+ vty_show_route_map_entry(vty, map);
+
+ list_delete_and_null(&maplist);
}
return CMD_SUCCESS;
}
diff --git a/lib/subdir.am b/lib/subdir.am
index 50cfd70a57..ef6c8f8e55 100644
--- a/lib/subdir.am
+++ b/lib/subdir.am
@@ -6,6 +6,7 @@ lib_libfrr_la_LDFLAGS = -version-info 0:0:0
lib_libfrr_la_LIBADD = @LIBCAP@
lib_libfrr_la_SOURCES = \
+ lib/agg_table.c \
lib/bfd.c \
lib/buffer.c \
lib/checksum.c \
@@ -89,6 +90,7 @@ lib/nexthop_group_clippy.c: $(CLIPPY_DEPS)
lib/nexthop_group.lo: lib/nexthop_group_clippy.c
pkginclude_HEADERS += \
+ lib/agg_table.h \
lib/bfd.h \
lib/bitfield.h \
lib/buffer.h \
@@ -291,7 +293,7 @@ if GIT_VERSION
# (even if gitversion.h's file timestamp doesn't change, make will think it
# did, because of .PHONY...)
-.PHONY: lib/gitversion.h.tmp
+PHONY_GITVERSION=lib/gitversion.h.tmp
.SILENT: lib/gitversion.h lib/gitversion.h.tmp
GITH=lib/gitversion.h
lib/gitversion.h.tmp: $(top_srcdir)/.git
@@ -300,7 +302,8 @@ lib/gitversion.h: lib/gitversion.h.tmp
{ test -f ${GITH} && diff -s -q ${GITH}.tmp ${GITH}; } || cp ${GITH}.tmp ${GITH}
else
-.PHONY: lib/gitversion.h
+PHONY_GITVERSION=lib/gitversion.h
lib/gitversion.h:
true
endif
+.PHONY: $(PHONY_GITVERSION)
diff --git a/lib/table.h b/lib/table.h
index 8304abe59b..711ace111e 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -126,9 +126,6 @@ struct route_table {
\
/* Each node of route. */ \
void *info; \
- \
- /* Aggregation. */ \
- void *aggregate;
/* Each routing entry. */
diff --git a/lib/zclient.h b/lib/zclient.h
index b8ff85e80f..cab734ae5e 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -91,7 +91,6 @@ typedef enum {
ZEBRA_IMPORT_ROUTE_REGISTER,
ZEBRA_IMPORT_ROUTE_UNREGISTER,
ZEBRA_IMPORT_CHECK_UPDATE,
- ZEBRA_IPV4_ROUTE_IPV6_NEXTHOP_ADD,
ZEBRA_BFD_DEST_REGISTER,
ZEBRA_BFD_DEST_DEREGISTER,
ZEBRA_BFD_DEST_UPDATE,
diff --git a/ospfd/ospf_bfd.c b/ospfd/ospf_bfd.c
index df41897660..594735a08f 100644
--- a/ospfd/ospf_bfd.c
+++ b/ospfd/ospf_bfd.c
@@ -312,7 +312,7 @@ void ospf_bfd_write_config(struct vty *vty, struct ospf_if_params *params)
* ospf_bfd_show_info - Show BFD info structure
*/
void ospf_bfd_show_info(struct vty *vty, void *bfd_info, json_object *json_obj,
- uint8_t use_json, int param_only)
+ bool use_json, int param_only)
{
if (param_only)
bfd_show_param(vty, (struct bfd_info *)bfd_info, 1, 0, use_json,
@@ -326,7 +326,7 @@ void ospf_bfd_show_info(struct vty *vty, void *bfd_info, json_object *json_obj,
* ospf_bfd_interface_show - Show the interface BFD configuration.
*/
void ospf_bfd_interface_show(struct vty *vty, struct interface *ifp,
- json_object *json_interface_sub, uint8_t use_json)
+ json_object *json_interface_sub, bool use_json)
{
struct ospf_if_params *params;
diff --git a/ospfd/ospf_bfd.h b/ospfd/ospf_bfd.h
index 6d7caf4217..74385d3268 100644
--- a/ospfd/ospf_bfd.h
+++ b/ospfd/ospf_bfd.h
@@ -35,13 +35,13 @@ extern void ospf_bfd_trigger_event(struct ospf_neighbor *nbr, int old_state,
extern void ospf_bfd_interface_show(struct vty *vty, struct interface *ifp,
json_object *json_interface_sub,
- uint8_t use_json);
+ bool use_json);
extern void ospf_bfd_info_nbr_create(struct ospf_interface *oi,
struct ospf_neighbor *nbr);
extern void ospf_bfd_show_info(struct vty *vty, void *bfd_info,
- json_object *json_obj, uint8_t use_json,
+ json_object *json_obj, bool use_json,
int param_only);
extern void ospf_bfd_info_free(void **bfd_info);
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 39f14a00c3..aa877903fc 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -2623,7 +2623,7 @@ const char *ospf_abr_type_descr_str[] = {"Unknown", "Standard (RFC2328)",
const char *ospf_shortcut_mode_descr_str[] = {"Default", "Enabled", "Disabled"};
static void show_ip_ospf_area(struct vty *vty, struct ospf_area *area,
- json_object *json_areas, uint8_t use_json)
+ json_object *json_areas, bool use_json)
{
json_object *json_area = NULL;
@@ -3243,7 +3243,7 @@ DEFUN (show_ip_ospf,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
char *vrf_name = NULL;
bool all_vrf = FALSE;
@@ -3263,11 +3263,15 @@ DEFUN (show_ip_ospf,
/* vrf input is provided could be all or specific vrf*/
if (vrf_name) {
+ bool ospf_output = FALSE;
+
use_vrf = 1;
+
if (all_vrf) {
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
if (!ospf->oi_running)
continue;
+ ospf_output = TRUE;
ret = show_ip_ospf_common(vty, ospf, json,
use_vrf);
}
@@ -3276,21 +3280,34 @@ DEFUN (show_ip_ospf,
json_object_to_json_string_ext(
json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
- }
+ } else if (!ospf_output)
+ vty_out(vty, "%% OSPF instance not found\n");
return ret;
}
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
if ((ospf == NULL) || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
} else {
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
/* Display default ospf (instance 0) info */
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
}
@@ -3321,7 +3338,7 @@ DEFUN (show_ip_ospf_instance,
int idx_number = 3;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int ret = CMD_SUCCESS;
json_object *json = NULL;
@@ -3350,7 +3367,7 @@ DEFUN (show_ip_ospf_instance,
static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf,
struct interface *ifp,
json_object *json_interface_sub,
- uint8_t use_json)
+ bool use_json)
{
int is_up;
struct ospf_neighbor *nbr;
@@ -3667,7 +3684,7 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf,
static int show_ip_ospf_interface_common(struct vty *vty, struct ospf *ospf,
char *intf_name, uint8_t use_vrf,
- json_object *json, uint8_t use_json)
+ json_object *json, bool use_json)
{
struct interface *ifp;
struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
@@ -3760,7 +3777,7 @@ static int show_ip_ospf_interface_common(struct vty *vty, struct ospf *ospf,
static void show_ip_ospf_interface_traffic_sub(struct vty *vty,
struct ospf_interface *oi,
json_object *json_interface_sub,
- uint8_t use_json)
+ bool use_json)
{
if (use_json) {
json_object_int_add(json_interface_sub, "ifIndex",
@@ -3798,7 +3815,7 @@ static void show_ip_ospf_interface_traffic_sub(struct vty *vty,
/* OSPFv2 Packet Counters */
static int show_ip_ospf_interface_traffic_common(
struct vty *vty, struct ospf *ospf, char *intf_name, json_object *json,
- int display_once, uint8_t use_vrf, uint8_t use_json)
+ int display_once, uint8_t use_vrf, bool use_json)
{
struct vrf *vrf = NULL;
struct interface *ifp = NULL;
@@ -3916,7 +3933,7 @@ DEFUN (show_ip_ospf_interface,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
char *vrf_name = NULL, *intf_name = NULL;
bool all_vrf = FALSE;
@@ -3951,14 +3968,21 @@ DEFUN (show_ip_ospf_interface,
json_object_to_json_string_ext(
json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
- }
+ } else if (!ospf)
+ vty_out(vty, "%% OSPF instance not found\n");
return ret;
}
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
ret = show_ip_ospf_interface_common(vty, ospf, intf_name,
@@ -3968,8 +3992,14 @@ DEFUN (show_ip_ospf_interface,
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
ret = show_ip_ospf_interface_common(vty, ospf, intf_name,
@@ -4000,7 +4030,7 @@ DEFUN (show_ip_ospf_instance_interface,
int idx_intf = 0;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
char *intf_name = NULL;
int ret = CMD_SUCCESS;
json_object *json = NULL;
@@ -4049,7 +4079,7 @@ DEFUN (show_ip_ospf_interface_traffic,
bool all_vrf = FALSE;
int inst = 0;
int idx_vrf = 0, idx_intf = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
int ret = CMD_SUCCESS;
int display_once = 0;
@@ -4125,7 +4155,7 @@ static void show_ip_ospf_neighbour_header(struct vty *vty)
static void show_ip_ospf_neighbor_sub(struct vty *vty,
struct ospf_interface *oi,
- json_object *json, uint8_t use_json)
+ json_object *json, bool use_json)
{
struct route_node *rn;
struct ospf_neighbor *nbr, *prev_nbr = NULL;
@@ -4236,7 +4266,7 @@ static void show_ip_ospf_neighbor_sub(struct vty *vty,
}
static int show_ip_ospf_neighbor_common(struct vty *vty, struct ospf *ospf,
- json_object *json, uint8_t use_json,
+ json_object *json, bool use_json,
uint8_t use_vrf)
{
struct ospf_interface *oi;
@@ -4298,7 +4328,7 @@ DEFUN (show_ip_ospf_neighbor,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
char *vrf_name = NULL;
bool all_vrf = FALSE;
@@ -4329,23 +4359,36 @@ DEFUN (show_ip_ospf_neighbor,
json_object_to_json_string_ext(
json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
- }
+ } else if (!ospf)
+ vty_out(vty, "OSPF instance not found\n");
return ret;
}
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
} else {
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
}
@@ -4381,7 +4424,7 @@ DEFUN (show_ip_ospf_instance_neighbor,
int idx_number = 3;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
int ret = CMD_SUCCESS;
@@ -4408,7 +4451,7 @@ DEFUN (show_ip_ospf_instance_neighbor,
}
static int show_ip_ospf_neighbor_all_common(struct vty *vty, struct ospf *ospf,
- json_object *json, uint8_t use_json,
+ json_object *json, bool use_json,
uint8_t use_vrf)
{
struct listnode *node;
@@ -4511,7 +4554,7 @@ DEFUN (show_ip_ospf_neighbor_all,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
char *vrf_name = NULL;
bool all_vrf = FALSE;
@@ -4593,7 +4636,7 @@ DEFUN (show_ip_ospf_instance_neighbor_all,
int idx_number = 3;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
int ret = CMD_SUCCESS;
@@ -4621,7 +4664,7 @@ DEFUN (show_ip_ospf_instance_neighbor_all,
static int show_ip_ospf_neighbor_int_common(struct vty *vty, struct ospf *ospf,
int arg_base,
struct cmd_token **argv,
- uint8_t use_json, uint8_t use_vrf)
+ bool use_json, uint8_t use_vrf)
{
struct interface *ifp;
struct route_node *rn;
@@ -4680,7 +4723,7 @@ DEFUN (show_ip_ospf_neighbor_int,
{
struct ospf *ospf;
int idx_ifname = 4;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
int ret = CMD_SUCCESS;
struct interface *ifp = NULL;
@@ -4716,7 +4759,7 @@ DEFUN (show_ip_ospf_instance_neighbor_int,
int idx_ifname = 5;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!uj)
show_ip_ospf_neighbour_header(vty);
@@ -4739,8 +4782,7 @@ DEFUN (show_ip_ospf_instance_neighbor_int,
static void show_ip_ospf_nbr_nbma_detail_sub(struct vty *vty,
struct ospf_interface *oi,
struct ospf_nbr_nbma *nbr_nbma,
- uint8_t use_json,
- json_object *json)
+ bool use_json, json_object *json)
{
char timebuf[OSPF_TIME_DUMP_SIZE];
json_object *json_sub = NULL;
@@ -4820,8 +4862,7 @@ static void show_ip_ospf_nbr_nbma_detail_sub(struct vty *vty,
static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
struct ospf_interface *oi,
struct ospf_neighbor *nbr,
- json_object *json,
- uint8_t use_json)
+ json_object *json, bool use_json)
{
char timebuf[OSPF_TIME_DUMP_SIZE];
json_object *json_sub = NULL;
@@ -5037,7 +5078,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
static int show_ip_ospf_neighbor_id_common(struct vty *vty, struct ospf *ospf,
int arg_base,
struct cmd_token **argv,
- uint8_t use_json, uint8_t use_vrf)
+ bool use_json, uint8_t use_vrf)
{
struct listnode *node;
struct ospf_neighbor *nbr;
@@ -5098,7 +5139,7 @@ DEFUN (show_ip_ospf_neighbor_id,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
int ret = CMD_SUCCESS;
@@ -5127,7 +5168,7 @@ DEFUN (show_ip_ospf_instance_neighbor_id,
int idx_router_id = 5;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
instance = strtoul(argv[idx_number]->arg, NULL, 10);
ospf = ospf_lookup_instance(instance);
@@ -5143,8 +5184,7 @@ DEFUN (show_ip_ospf_instance_neighbor_id,
static int show_ip_ospf_neighbor_detail_common(struct vty *vty,
struct ospf *ospf,
- json_object *json,
- uint8_t use_json,
+ json_object *json, bool use_json,
uint8_t use_vrf)
{
struct ospf_interface *oi;
@@ -5212,7 +5252,7 @@ DEFUN (show_ip_ospf_neighbor_detail,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
char *vrf_name = NULL;
bool all_vrf = FALSE;
@@ -5292,7 +5332,7 @@ DEFUN (show_ip_ospf_instance_neighbor_detail,
int idx_number = 3;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
int ret = CMD_SUCCESS;
@@ -5321,7 +5361,7 @@ DEFUN (show_ip_ospf_instance_neighbor_detail,
static int show_ip_ospf_neighbor_detail_all_common(struct vty *vty,
struct ospf *ospf,
json_object *json,
- uint8_t use_json,
+ bool use_json,
uint8_t use_vrf)
{
struct listnode *node;
@@ -5401,7 +5441,7 @@ DEFUN (show_ip_ospf_neighbor_detail_all,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
char *vrf_name = NULL;
bool all_vrf = FALSE;
@@ -5483,7 +5523,7 @@ DEFUN (show_ip_ospf_instance_neighbor_detail_all,
int idx_number = 3;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
int ret = CMD_SUCCESS;
@@ -5513,7 +5553,7 @@ static int show_ip_ospf_neighbor_int_detail_common(struct vty *vty,
struct ospf *ospf,
int arg_base,
struct cmd_token **argv,
- uint8_t use_json)
+ bool use_json)
{
struct ospf_interface *oi;
struct interface *ifp;
@@ -5581,17 +5621,22 @@ DEFUN (show_ip_ospf_neighbor_int_detail,
JSON_STR)
{
struct ospf *ospf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct listnode *node = NULL;
int ret = CMD_SUCCESS;
+ bool ospf_output = FALSE;
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
if (!ospf->oi_running)
continue;
+ ospf_output = TRUE;
ret = show_ip_ospf_neighbor_int_detail_common(vty, ospf, 0,
argv, uj);
}
+ if (!ospf_output)
+ vty_out(vty, "%% OSPF instance not found\n");
+
return ret;
}
@@ -5611,7 +5656,7 @@ DEFUN (show_ip_ospf_instance_neighbor_int_detail,
int idx_ifname = 5;
struct ospf *ospf;
unsigned short instance = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
instance = strtoul(argv[idx_number]->arg, NULL, 10);
ospf = ospf_lookup_instance(instance);
@@ -6296,19 +6341,28 @@ DEFUN (show_ip_ospf_database_max,
OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
if (vrf_name) {
+ bool ospf_output = FALSE;
+
use_vrf = 1;
+
if (all_vrf) {
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
if (!ospf->oi_running)
continue;
+ ospf_output = TRUE;
ret = show_ip_ospf_database_common(
vty, ospf, idx_vrf ? 2 : 0, argc, argv,
use_vrf);
}
+
+ if (!ospf_output)
+ vty_out(vty, "%% OSPF instance not found\n");
} else {
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
- if (ospf == NULL || !ospf->oi_running)
+ if (ospf == NULL || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
ret = (show_ip_ospf_database_common(
vty, ospf, idx_vrf ? 2 : 0, argc, argv,
use_vrf));
@@ -6316,8 +6370,11 @@ DEFUN (show_ip_ospf_database_max,
} else {
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
- if (ospf == NULL || !ospf->oi_running)
+ if (ospf == NULL || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
ret = show_ip_ospf_database_common(vty, ospf, 0, argc, argv,
use_vrf);
}
@@ -6377,16 +6434,22 @@ DEFUN (show_ip_ospf_instance_database,
}
} else {
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
- if ((ospf == NULL) || !ospf->oi_running)
+ if ((ospf == NULL) || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
ret = (show_ip_ospf_database_common(
vty, ospf, idx ? 2 : 0, argc, argv, use_vrf));
}
} else {
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
- if (ospf == NULL || !ospf->oi_running)
+ if (ospf == NULL || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
ret = (show_ip_ospf_database_common(vty, ospf, 0, argc, argv,
use_vrf));
}
@@ -6415,8 +6478,10 @@ DEFUN (show_ip_ospf_instance_database_max,
if (ospf == NULL)
return CMD_NOT_MY_INSTANCE;
- if (!ospf->oi_running)
+ if (!ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
return show_ip_ospf_database_common(vty, ospf, 1, argc, argv, 0);
}
@@ -6505,8 +6570,11 @@ DEFUN (show_ip_ospf_instance_database_type_adv_router,
ospf = ospf_lookup_instance(instance);
if (ospf == NULL)
return CMD_NOT_MY_INSTANCE;
- if (!ospf->oi_running)
+ if (!ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
return (show_ip_ospf_database_type_adv_router_common(
vty, ospf, idx ? 1 : 0, argc, argv, use_vrf));
}
@@ -6514,27 +6582,39 @@ DEFUN (show_ip_ospf_instance_database_type_adv_router,
OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
if (vrf_name) {
+ bool ospf_output = FALSE;
+
use_vrf = 1;
+
if (all_vrf) {
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
if (!ospf->oi_running)
continue;
+ ospf_output = TRUE;
ret = show_ip_ospf_database_type_adv_router_common(
vty, ospf, idx ? 1 : 0, argc, argv,
use_vrf);
}
+ if (!ospf_output)
+ vty_out(vty, "%% OSPF instance not found\n");
} else {
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
- if ((ospf == NULL) || !ospf->oi_running)
+ if ((ospf == NULL) || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
ret = show_ip_ospf_database_type_adv_router_common(
vty, ospf, idx ? 1 : 0, argc, argv, use_vrf);
}
} else {
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
- if (ospf == NULL || !ospf->oi_running)
+ if (ospf == NULL || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
ret = show_ip_ospf_database_type_adv_router_common(
vty, ospf, idx ? 1 : 0, argc, argv, use_vrf);
}
@@ -9271,19 +9351,28 @@ DEFUN (show_ip_ospf_border_routers,
OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
if (vrf_name) {
+ bool ospf_output = FALSE;
+
use_vrf = 1;
+
if (all_vrf) {
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
if (!ospf->oi_running)
continue;
+ ospf_output = TRUE;
ret = show_ip_ospf_border_routers_common(
vty, ospf, use_vrf);
}
+
+ if (!ospf_output)
+ vty_out(vty, "%% OSPF instance not found\n");
} else {
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
- if (ospf == NULL || !ospf->oi_running)
+ if (ospf == NULL || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
ret = show_ip_ospf_border_routers_common(vty, ospf,
use_vrf);
@@ -9291,8 +9380,11 @@ DEFUN (show_ip_ospf_border_routers,
} else {
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
- if (ospf == NULL || !ospf->oi_running)
+ if (ospf == NULL || !ospf->oi_running) {
+ vty_out(vty, "%% OSPF instance not found\n");
return CMD_SUCCESS;
+ }
+
ret = show_ip_ospf_border_routers_common(vty, ospf, use_vrf);
}
@@ -9393,7 +9485,7 @@ DEFUN (show_ip_ospf_route,
int inst = 0;
int idx_vrf = 0;
uint8_t use_vrf = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
if (uj)
@@ -9403,11 +9495,15 @@ DEFUN (show_ip_ospf_route,
/* vrf input is provided could be all or specific vrf*/
if (vrf_name) {
+ bool ospf_output = FALSE;
+
use_vrf = 1;
+
if (all_vrf) {
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
if (!ospf->oi_running)
continue;
+ ospf_output = TRUE;
ret = show_ip_ospf_route_common(vty, ospf, json,
use_vrf);
}
@@ -9417,22 +9513,35 @@ DEFUN (show_ip_ospf_route,
vty_out(vty, "%s\n",
json_object_to_json_string(json));
json_object_free(json);
- }
+ } else if (!ospf_output)
+ vty_out(vty, "%% OSPF instance not found\n");
return ret;
}
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
} else {
/* Display default ospf (instance 0) info */
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
if (ospf == NULL || !ospf->oi_running) {
- if (uj)
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
return CMD_SUCCESS;
}
}
@@ -9484,7 +9593,7 @@ DEFUN (show_ip_ospf_vrfs,
"Show OSPF VRFs \n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
json_object *json = NULL;
json_object *json_vrfs = NULL;
struct ospf *ospf = NULL;
diff --git a/pimd/pim_bfd.c b/pimd/pim_bfd.c
index f7a217b514..466cc60643 100644
--- a/pimd/pim_bfd.c
+++ b/pimd/pim_bfd.c
@@ -64,7 +64,7 @@ void pim_bfd_write_config(struct vty *vty, struct interface *ifp)
* pim_bfd_show_info - Show BFD info structure
*/
void pim_bfd_show_info(struct vty *vty, void *bfd_info, json_object *json_obj,
- uint8_t use_json, int param_only)
+ bool use_json, int param_only)
{
if (param_only)
bfd_show_param(vty, (struct bfd_info *)bfd_info, 1, 0, use_json,
diff --git a/pimd/pim_bfd.h b/pimd/pim_bfd.h
index 83def93b66..962b727f88 100644
--- a/pimd/pim_bfd.h
+++ b/pimd/pim_bfd.h
@@ -28,7 +28,7 @@
void pim_bfd_init(void);
void pim_bfd_write_config(struct vty *vty, struct interface *ifp);
void pim_bfd_show_info(struct vty *vty, void *bfd_info, json_object *json_obj,
- uint8_t use_json, int param_only);
+ bool use_json, int param_only);
void pim_bfd_if_param_set(struct interface *ifp, uint32_t min_rx,
uint32_t min_tx, uint8_t detect_mult, int defaults);
int pim_bfd_reg_dereg_all_nbr(struct interface *ifp, int command);
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 611d8d3681..918eaf2fdb 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -3373,7 +3373,7 @@ DEFUN (show_ip_igmp_interface,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3400,7 +3400,7 @@ DEFUN (show_ip_igmp_interface_vrf_all,
JSON_STR)
{
int idx = 2;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -3456,7 +3456,7 @@ DEFUN (show_ip_igmp_join_vrf_all,
VRF_CMD_HELP_STR
"IGMP static join information\n")
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -3490,7 +3490,7 @@ DEFUN (show_ip_igmp_groups,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3510,7 +3510,7 @@ DEFUN (show_ip_igmp_groups_vrf_all,
IGMP_GROUP_STR
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -3608,7 +3608,7 @@ DEFUN (show_ip_igmp_statistics,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3715,7 +3715,7 @@ DEFUN (show_ip_pim_interface,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3742,7 +3742,7 @@ DEFUN (show_ip_pim_interface_vrf_all,
JSON_STR)
{
int idx = 6;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -3781,7 +3781,7 @@ DEFUN (show_ip_pim_join,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3801,7 +3801,7 @@ DEFUN (show_ip_pim_join_vrf_all,
"PIM interface join information\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -3835,7 +3835,7 @@ DEFUN (show_ip_pim_local_membership,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3859,7 +3859,7 @@ DEFUN (show_ip_pim_neighbor,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3886,7 +3886,7 @@ DEFUN (show_ip_pim_neighbor_vrf_all,
JSON_STR)
{
int idx = 2;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -3949,7 +3949,7 @@ DEFUN (show_ip_pim_state,
const char *group = NULL;
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -3983,7 +3983,7 @@ DEFUN (show_ip_pim_state_vrf_all,
const char *src_or_group = NULL;
const char *group = NULL;
int idx = 2;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -4026,7 +4026,7 @@ DEFUN (show_ip_pim_upstream,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -4046,7 +4046,7 @@ DEFUN (show_ip_pim_upstream_vrf_all,
"PIM upstream information\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -4078,7 +4078,7 @@ DEFUN (show_ip_pim_upstream_join_desired,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -4100,7 +4100,7 @@ DEFUN (show_ip_pim_upstream_rpf,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -4122,7 +4122,7 @@ DEFUN (show_ip_pim_rp,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -4142,7 +4142,7 @@ DEFUN (show_ip_pim_rp_vrf_all,
"PIM RP information\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -4176,7 +4176,7 @@ DEFUN (show_ip_pim_rpf,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -4196,7 +4196,7 @@ DEFUN (show_ip_pim_rpf_vrf_all,
"PIM cached source rpf information\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -4349,7 +4349,7 @@ DEFUN (show_ip_pim_interface_traffic,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -4473,7 +4473,7 @@ DEFUN (show_ip_multicast_vrf_all,
VRF_CMD_HELP_STR
"Multicast global information\n")
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -4830,7 +4830,7 @@ DEFUN (show_ip_mroute,
"Fill in Assumed data\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
bool fill = false;
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
@@ -4855,7 +4855,7 @@ DEFUN (show_ip_mroute_vrf_all,
"Fill in Assumed data\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 4;
struct vrf *vrf;
bool first = true;
@@ -4963,7 +4963,7 @@ DEFUN (show_ip_mroute_count_vrf_all,
VRF_CMD_HELP_STR
"Route and packet count data\n")
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -5578,7 +5578,7 @@ DEFUN (show_ip_pim_ssm_range,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -5631,7 +5631,7 @@ DEFUN (show_ip_pim_group_type,
{
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!vrf)
return CMD_WARNING;
@@ -7985,7 +7985,7 @@ DEFUN (show_ip_msdp_mesh_group,
"MSDP mesh-group information\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
@@ -8007,7 +8007,7 @@ DEFUN (show_ip_msdp_mesh_group_vrf_all,
"MSDP mesh-group information\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -8200,7 +8200,7 @@ DEFUN (show_ip_msdp_peer_detail,
"peer ip address\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
@@ -8235,7 +8235,7 @@ DEFUN (show_ip_msdp_peer_detail_vrf_all,
JSON_STR)
{
int idx = 2;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -8441,7 +8441,7 @@ DEFUN (show_ip_msdp_sa_detail,
"Detailed output\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
int idx = 2;
struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
@@ -8464,7 +8464,7 @@ DEFUN (show_ip_msdp_sa_detail_vrf_all,
"Detailed output\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
@@ -8556,7 +8556,7 @@ DEFUN (show_ip_msdp_sa_sg,
"group ip\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
int idx = 2;
@@ -8593,7 +8593,7 @@ DEFUN (show_ip_msdp_sa_sg_vrf_all,
"group ip\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
struct vrf *vrf;
bool first = true;
int idx = 2;
diff --git a/python/clidef.py b/python/clidef.py
index 2e55909647..4134f4c94e 100644
--- a/python/clidef.py
+++ b/python/clidef.py
@@ -277,4 +277,4 @@ if __name__ == '__main__':
process_file(args.cfile, ofd, dumpfd, args.all_defun)
if args.o is not None:
- clippy.wrdiff(args.o, ofd, [args.cfile, os.path.realpath(__file__)])
+ clippy.wrdiff(args.o, ofd, [args.cfile, os.path.realpath(__file__), sys.executable])
diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c
index ef324b001a..d7d3d245d6 100644
--- a/ripngd/ripng_interface.c
+++ b/ripngd/ripng_interface.c
@@ -31,7 +31,7 @@
#include "stream.h"
#include "zclient.h"
#include "command.h"
-#include "table.h"
+#include "agg_table.h"
#include "thread.h"
#include "privs.h"
#include "vrf.h"
@@ -159,14 +159,15 @@ static int ripng_if_ipv6_lladdress_check(struct interface *ifp)
static int ripng_if_down(struct interface *ifp)
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_interface *ri;
struct list *list = NULL;
struct listnode *listnode = NULL, *nextnode = NULL;
if (ripng)
- for (rp = route_top(ripng->table); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->table); rp;
+ rp = agg_route_next(rp))
if ((list = rp->info) != NULL)
for (ALL_LIST_ELEMENTS(list, listnode, nextnode,
rinfo))
@@ -479,7 +480,7 @@ int ripng_interface_address_delete(int command, struct zclient *zclient,
vector ripng_enable_if;
/* RIPng enable network table. */
-struct route_table *ripng_enable_network;
+struct agg_table *ripng_enable_network;
/* Lookup RIPng enable network. */
/* Check wether the interface has at least a connected prefix that
@@ -492,7 +493,7 @@ static int ripng_enable_network_lookup_if(struct interface *ifp)
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) {
struct prefix *p;
- struct route_node *n;
+ struct agg_node *n;
p = connected->address;
@@ -501,10 +502,10 @@ static int ripng_enable_network_lookup_if(struct interface *ifp)
address.prefix = p->u.prefix6;
address.prefixlen = IPV6_MAX_BITLEN;
- n = route_node_match(ripng_enable_network,
- (struct prefix *)&address);
+ n = agg_node_match(ripng_enable_network,
+ (struct prefix *)&address);
if (n) {
- route_unlock_node(n);
+ agg_unlock_node(n);
return 1;
}
}
@@ -521,7 +522,7 @@ static int ripng_enable_network_lookup2(struct connected *connected)
p = connected->address;
if (p->family == AF_INET6) {
- struct route_node *node;
+ struct agg_node *node;
address.family = p->family;
address.prefix = p->u.prefix6;
@@ -529,11 +530,11 @@ static int ripng_enable_network_lookup2(struct connected *connected)
/* LPM on p->family, p->u.prefix6/IPV6_MAX_BITLEN within
* ripng_enable_network */
- node = route_node_match(ripng_enable_network,
- (struct prefix *)&address);
+ node = agg_node_match(ripng_enable_network,
+ (struct prefix *)&address);
if (node) {
- route_unlock_node(node);
+ agg_unlock_node(node);
return 1;
}
}
@@ -544,12 +545,12 @@ static int ripng_enable_network_lookup2(struct connected *connected)
/* Add RIPng enable network. */
static int ripng_enable_network_add(struct prefix *p)
{
- struct route_node *node;
+ struct agg_node *node;
- node = route_node_get(ripng_enable_network, p);
+ node = agg_node_get(ripng_enable_network, p);
if (node->info) {
- route_unlock_node(node);
+ agg_unlock_node(node);
return -1;
} else
node->info = (void *)1;
@@ -563,17 +564,17 @@ static int ripng_enable_network_add(struct prefix *p)
/* Delete RIPng enable network. */
static int ripng_enable_network_delete(struct prefix *p)
{
- struct route_node *node;
+ struct agg_node *node;
- node = route_node_lookup(ripng_enable_network, p);
+ node = agg_node_lookup(ripng_enable_network, p);
if (node) {
node->info = NULL;
/* Unlock info lock. */
- route_unlock_node(node);
+ agg_unlock_node(node);
/* Unlock lookup lock. */
- route_unlock_node(node);
+ agg_unlock_node(node);
return 1;
}
@@ -771,13 +772,14 @@ void ripng_clean_network()
{
unsigned int i;
char *str;
- struct route_node *rn;
+ struct agg_node *rn;
/* ripng_enable_network */
- for (rn = route_top(ripng_enable_network); rn; rn = route_next(rn))
+ for (rn = agg_route_top(ripng_enable_network); rn;
+ rn = agg_route_next(rn))
if (rn->info) {
rn->info = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
}
/* ripng_enable_if */
@@ -877,12 +879,12 @@ int ripng_network_write(struct vty *vty, int config_mode)
{
unsigned int i;
const char *ifname;
- struct route_node *node;
+ struct agg_node *node;
char buf[BUFSIZ];
/* Write enable network. */
- for (node = route_top(ripng_enable_network); node;
- node = route_next(node))
+ for (node = agg_route_top(ripng_enable_network); node;
+ node = agg_route_next(node))
if (node->info) {
struct prefix *p = &node->p;
vty_out(vty, "%s%s/%d\n",
@@ -1124,7 +1126,7 @@ void ripng_if_init()
hook_register_prio(if_del, 0, ripng_if_delete_hook);
/* RIPng enable network init. */
- ripng_enable_network = route_table_init();
+ ripng_enable_network = agg_table_init();
/* RIPng enable interface init. */
ripng_enable_if = vector_init(1);
diff --git a/ripngd/ripng_route.c b/ripngd/ripng_route.c
index 83cb59c8b8..f66a0b9527 100644
--- a/ripngd/ripng_route.c
+++ b/ripngd/ripng_route.c
@@ -22,7 +22,7 @@
#include <zebra.h>
#include "prefix.h"
-#include "table.h"
+#include "agg_table.h"
#include "memory.h"
#include "if.h"
#include "vty.h"
@@ -44,13 +44,12 @@ void ripng_aggregate_free(struct ripng_aggregate *aggregate)
}
/* Aggregate count increment check. */
-void ripng_aggregate_increment(struct route_node *child,
- struct ripng_info *rinfo)
+void ripng_aggregate_increment(struct agg_node *child, struct ripng_info *rinfo)
{
- struct route_node *np;
+ struct agg_node *np;
struct ripng_aggregate *aggregate;
- for (np = child; np; np = np->parent)
+ for (np = child; np; np = agg_node_parent(np))
if ((aggregate = np->aggregate) != NULL) {
aggregate->count++;
rinfo->suppress++;
@@ -58,13 +57,12 @@ void ripng_aggregate_increment(struct route_node *child,
}
/* Aggregate count decrement check. */
-void ripng_aggregate_decrement(struct route_node *child,
- struct ripng_info *rinfo)
+void ripng_aggregate_decrement(struct agg_node *child, struct ripng_info *rinfo)
{
- struct route_node *np;
+ struct agg_node *np;
struct ripng_aggregate *aggregate;
- for (np = child; np; np = np->parent)
+ for (np = child; np; np = agg_node_parent(np))
if ((aggregate = np->aggregate) != NULL) {
aggregate->count--;
rinfo->suppress--;
@@ -72,14 +70,14 @@ void ripng_aggregate_decrement(struct route_node *child,
}
/* Aggregate count decrement check for a list. */
-void ripng_aggregate_decrement_list(struct route_node *child, struct list *list)
+void ripng_aggregate_decrement_list(struct agg_node *child, struct list *list)
{
- struct route_node *np;
+ struct agg_node *np;
struct ripng_aggregate *aggregate;
struct ripng_info *rinfo = NULL;
struct listnode *node = NULL;
- for (np = child; np; np = np->parent)
+ for (np = child; np; np = agg_node_parent(np))
if ((aggregate = np->aggregate) != NULL)
aggregate->count -= listcount(list);
@@ -90,8 +88,8 @@ void ripng_aggregate_decrement_list(struct route_node *child, struct list *list)
/* RIPng routes treatment. */
int ripng_aggregate_add(struct prefix *p)
{
- struct route_node *top;
- struct route_node *rp;
+ struct agg_node *top;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_aggregate *aggregate;
struct ripng_aggregate *sub;
@@ -99,7 +97,7 @@ int ripng_aggregate_add(struct prefix *p)
struct listnode *node = NULL;
/* Get top node for aggregation. */
- top = route_node_get(ripng->table, p);
+ top = agg_node_get(ripng->table, p);
/* Allocate new aggregate. */
aggregate = ripng_aggregate_new();
@@ -108,7 +106,7 @@ int ripng_aggregate_add(struct prefix *p)
top->aggregate = aggregate;
/* Suppress routes match to the aggregate. */
- for (rp = route_lock_node(top); rp; rp = route_next_until(rp, top)) {
+ for (rp = agg_lock_node(top); rp; rp = agg_route_next_until(rp, top)) {
/* Suppress normal route. */
if ((list = rp->info) != NULL)
for (ALL_LIST_ELEMENTS_RO(list, node, rinfo)) {
@@ -128,8 +126,8 @@ int ripng_aggregate_add(struct prefix *p)
/* Delete RIPng static route. */
int ripng_aggregate_delete(struct prefix *p)
{
- struct route_node *top;
- struct route_node *rp;
+ struct agg_node *top;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_aggregate *aggregate;
struct ripng_aggregate *sub;
@@ -137,13 +135,13 @@ int ripng_aggregate_delete(struct prefix *p)
struct listnode *node = NULL;
/* Get top node for aggregation. */
- top = route_node_get(ripng->table, p);
+ top = agg_node_get(ripng->table, p);
/* Allocate new aggregate. */
aggregate = top->aggregate;
/* Suppress routes match to the aggregate. */
- for (rp = route_lock_node(top); rp; rp = route_next_until(rp, top)) {
+ for (rp = agg_lock_node(top); rp; rp = agg_route_next_until(rp, top)) {
/* Suppress normal route. */
if ((list = rp->info) != NULL)
for (ALL_LIST_ELEMENTS_RO(list, node, rinfo)) {
@@ -160,8 +158,8 @@ int ripng_aggregate_delete(struct prefix *p)
top->aggregate = NULL;
ripng_aggregate_free(aggregate);
- route_unlock_node(top);
- route_unlock_node(top);
+ agg_unlock_node(top);
+ agg_unlock_node(top);
return 0;
}
diff --git a/ripngd/ripng_route.h b/ripngd/ripng_route.h
index dc7d422d1e..e402f4a66c 100644
--- a/ripngd/ripng_route.h
+++ b/ripngd/ripng_route.h
@@ -42,11 +42,11 @@ struct ripng_aggregate {
uint16_t tag_out;
};
-extern void ripng_aggregate_increment(struct route_node *rp,
+extern void ripng_aggregate_increment(struct agg_node *rp,
struct ripng_info *rinfo);
-extern void ripng_aggregate_decrement(struct route_node *rp,
+extern void ripng_aggregate_decrement(struct agg_node *rp,
struct ripng_info *rinfo);
-extern void ripng_aggregate_decrement_list(struct route_node *rp,
+extern void ripng_aggregate_decrement_list(struct agg_node *rp,
struct list *list);
extern int ripng_aggregate_add(struct prefix *p);
extern int ripng_aggregate_delete(struct prefix *p);
diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c
index 6830e0e926..a8cc9ee128 100644
--- a/ripngd/ripng_zebra.c
+++ b/ripngd/ripng_zebra.c
@@ -23,7 +23,7 @@
#include "command.h"
#include "prefix.h"
-#include "table.h"
+#include "agg_table.h"
#include "stream.h"
#include "memory.h"
#include "routemap.h"
@@ -37,7 +37,7 @@
struct zclient *zclient = NULL;
/* Send ECMP routes to zebra. */
-static void ripng_zebra_ipv6_send(struct route_node *rp, uint8_t cmd)
+static void ripng_zebra_ipv6_send(struct agg_node *rp, uint8_t cmd)
{
struct list *list = (struct list *)rp->info;
struct zapi_route api;
@@ -100,13 +100,13 @@ static void ripng_zebra_ipv6_send(struct route_node *rp, uint8_t cmd)
}
/* Add/update ECMP routes to zebra. */
-void ripng_zebra_ipv6_add(struct route_node *rp)
+void ripng_zebra_ipv6_add(struct agg_node *rp)
{
ripng_zebra_ipv6_send(rp, ZEBRA_ROUTE_ADD);
}
/* Delete ECMP routes from zebra. */
-void ripng_zebra_ipv6_delete(struct route_node *rp)
+void ripng_zebra_ipv6_delete(struct agg_node *rp)
{
ripng_zebra_ipv6_send(rp, ZEBRA_ROUTE_DELETE);
}
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index 934a87b075..d1341d67b7 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -27,7 +27,7 @@
#include "memory.h"
#include "if.h"
#include "stream.h"
-#include "table.h"
+#include "agg_table.h"
#include "command.h"
#include "sockopt.h"
#include "distribute.h"
@@ -394,7 +394,7 @@ static int ripng_lladdr_check(struct interface *ifp, struct in6_addr *addr)
static int ripng_garbage_collect(struct thread *t)
{
struct ripng_info *rinfo;
- struct route_node *rp;
+ struct agg_node *rp;
rinfo = THREAD_ARG(t);
rinfo->t_garbage_collect = NULL;
@@ -409,7 +409,7 @@ static int ripng_garbage_collect(struct thread *t)
listnode_delete(rp->info, rinfo);
if (list_isempty((struct list *)rp->info)) {
list_delete_and_null((struct list **)&rp->info);
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
/* Free RIPng routing information. */
@@ -426,7 +426,7 @@ static void ripng_timeout_update(struct ripng_info *rinfo);
*/
struct ripng_info *ripng_ecmp_add(struct ripng_info *rinfo_new)
{
- struct route_node *rp = rinfo_new->rp;
+ struct agg_node *rp = rinfo_new->rp;
struct ripng_info *rinfo = NULL;
struct list *list = NULL;
@@ -465,7 +465,7 @@ struct ripng_info *ripng_ecmp_add(struct ripng_info *rinfo_new)
*/
struct ripng_info *ripng_ecmp_replace(struct ripng_info *rinfo_new)
{
- struct route_node *rp = rinfo_new->rp;
+ struct agg_node *rp = rinfo_new->rp;
struct list *list = (struct list *)rp->info;
struct ripng_info *rinfo = NULL, *tmp_rinfo = NULL;
struct listnode *node = NULL, *nextnode = NULL;
@@ -522,7 +522,7 @@ struct ripng_info *ripng_ecmp_replace(struct ripng_info *rinfo_new)
*/
struct ripng_info *ripng_ecmp_delete(struct ripng_info *rinfo)
{
- struct route_node *rp = rinfo->rp;
+ struct agg_node *rp = rinfo->rp;
struct list *list = (struct list *)rp->info;
RIPNG_TIMER_OFF(rinfo->t_timeout);
@@ -664,7 +664,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
{
int ret;
struct prefix_ipv6 p;
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo = NULL, newinfo;
struct ripng_interface *ri;
struct in6_addr *nexthop;
@@ -773,7 +773,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
nexthop = &from->sin6_addr;
/* Lookup RIPng routing table. */
- rp = route_node_get(ripng->table, (struct prefix *)&p);
+ rp = agg_node_get(ripng->table, (struct prefix *)&p);
newinfo.rp = rp;
newinfo.nexthop = *nexthop;
@@ -798,7 +798,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
if (rte->metric > rinfo->metric) {
/* New route has a greater metric.
* Discard it. */
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return;
}
@@ -821,7 +821,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
/* Redistributed route check. */
if (rinfo->type != ZEBRA_ROUTE_RIPNG
&& rinfo->metric != RIPNG_METRIC_INFINITY) {
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return;
}
@@ -830,7 +830,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
&& ((rinfo->sub_type == RIPNG_ROUTE_STATIC)
|| (rinfo->sub_type == RIPNG_ROUTE_DEFAULT))
&& rinfo->metric != RIPNG_METRIC_INFINITY) {
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return;
}
}
@@ -844,7 +844,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
if (rte->metric != RIPNG_METRIC_INFINITY)
ripng_ecmp_add(&newinfo);
else
- route_unlock_node(rp);
+ agg_unlock_node(rp);
} else {
/* If there is an existing route, compare the next hop address
to the address of the router from which the datagram came.
@@ -890,7 +890,7 @@ static void ripng_route_process(struct rte *rte, struct sockaddr_in6 *from,
ripng_timeout_update(rinfo);
/* Unlock tempolary lock of the route. */
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
}
@@ -899,7 +899,7 @@ void ripng_redistribute_add(int type, int sub_type, struct prefix_ipv6 *p,
ifindex_t ifindex, struct in6_addr *nexthop,
route_tag_t tag)
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo = NULL, newinfo;
struct list *list = NULL;
@@ -909,7 +909,7 @@ void ripng_redistribute_add(int type, int sub_type, struct prefix_ipv6 *p,
if (IN6_IS_ADDR_LOOPBACK(&p->prefix))
return;
- rp = route_node_get(ripng->table, (struct prefix *)p);
+ rp = agg_node_get(ripng->table, (struct prefix *)p);
memset(&newinfo, 0, sizeof(struct ripng_info));
newinfo.type = type;
@@ -928,7 +928,7 @@ void ripng_redistribute_add(int type, int sub_type, struct prefix_ipv6 *p,
if (rinfo->type == ZEBRA_ROUTE_CONNECT
&& rinfo->sub_type == RIPNG_ROUTE_INTERFACE
&& rinfo->metric != RIPNG_METRIC_INFINITY) {
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return;
}
@@ -941,13 +941,13 @@ void ripng_redistribute_add(int type, int sub_type, struct prefix_ipv6 *p,
if (type != ZEBRA_ROUTE_RIPNG
|| ((sub_type != RIPNG_ROUTE_STATIC)
&& (sub_type != RIPNG_ROUTE_DEFAULT))) {
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return;
}
}
ripng_ecmp_replace(&newinfo);
- route_unlock_node(rp);
+ agg_unlock_node(rp);
} else
ripng_ecmp_add(&newinfo);
@@ -972,7 +972,7 @@ void ripng_redistribute_add(int type, int sub_type, struct prefix_ipv6 *p,
void ripng_redistribute_delete(int type, int sub_type, struct prefix_ipv6 *p,
ifindex_t ifindex)
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
if (IN6_IS_ADDR_LINKLOCAL(&p->prefix))
@@ -980,7 +980,7 @@ void ripng_redistribute_delete(int type, int sub_type, struct prefix_ipv6 *p,
if (IN6_IS_ADDR_LOOPBACK(&p->prefix))
return;
- rp = route_node_lookup(ripng->table, (struct prefix *)p);
+ rp = agg_node_lookup(ripng->table, (struct prefix *)p);
if (rp) {
struct list *list = rp->info;
@@ -1014,21 +1014,21 @@ void ripng_redistribute_delete(int type, int sub_type, struct prefix_ipv6 *p,
ripng_event(RIPNG_TRIGGERED_UPDATE, 0);
}
}
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
}
/* Withdraw redistributed route. */
void ripng_redistribute_withdraw(int type)
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo = NULL;
struct list *list = NULL;
if (!ripng)
return;
- for (rp = route_top(ripng->table); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp))
if ((list = rp->info) != NULL) {
rinfo = listgetdata(listhead(list));
if ((rinfo->type == type)
@@ -1199,7 +1199,7 @@ static void ripng_request_process(struct ripng_packet *packet, int size,
caddr_t lim;
struct rte *rte;
struct prefix_ipv6 p;
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_interface *ri;
@@ -1255,14 +1255,13 @@ static void ripng_request_process(struct ripng_packet *packet, int size,
p.prefixlen = rte->prefixlen;
apply_mask_ipv6(&p);
- rp = route_node_lookup(ripng->table,
- (struct prefix *)&p);
+ rp = agg_node_lookup(ripng->table, (struct prefix *)&p);
if (rp) {
rinfo = listgetdata(
listhead((struct list *)rp->info));
rte->metric = rinfo->metric;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
} else
rte->metric = RIPNG_METRIC_INFINITY;
}
@@ -1361,12 +1360,12 @@ static int ripng_read(struct thread *thread)
/* Walk down the RIPng routing table then clear changed flag. */
static void ripng_clear_changed_flag(void)
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo = NULL;
struct list *list = NULL;
struct listnode *listnode = NULL;
- for (rp = route_top(ripng->table); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp))
if ((list = rp->info) != NULL)
for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
UNSET_FLAG(rinfo->flags, RIPNG_RTF_CHANGED);
@@ -1535,7 +1534,7 @@ void ripng_output_process(struct interface *ifp, struct sockaddr_in6 *to,
int route_type)
{
int ret;
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_interface *ri;
struct ripng_aggregate *aggregate;
@@ -1558,7 +1557,7 @@ void ripng_output_process(struct interface *ifp, struct sockaddr_in6 *to,
ripng_rte_list = ripng_rte_new();
- for (rp = route_top(ripng->table); rp; rp = route_next(rp)) {
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
if ((list = rp->info) != NULL
&& (rinfo = listgetdata(listhead(list))) != NULL
&& rinfo->suppress == 0) {
@@ -1807,9 +1806,9 @@ static int ripng_create(void)
ripng->obuf = stream_new(RIPNG_MAX_PACKET_SIZE);
/* Initialize RIPng routig table. */
- ripng->table = route_table_init();
- ripng->route = route_table_init();
- ripng->aggregate = route_table_init();
+ ripng->table = agg_table_init();
+ ripng->route = agg_table_init();
+ ripng->aggregate = agg_table_init();
/* Make socket. */
ripng->sock = ripng_make_socket();
@@ -1952,7 +1951,7 @@ DEFUN (show_ipv6_ripng,
IPV6_STR
"Show RIPng routes\n")
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_aggregate *aggregate;
struct prefix_ipv6 *p;
@@ -1971,7 +1970,7 @@ DEFUN (show_ipv6_ripng,
" (i) - interface, (a/S) - aggregated/Suppressed\n\n"
" Network Next Hop Via Metric Tag Time\n");
- for (rp = route_top(ripng->table); rp; rp = route_next(rp)) {
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
if ((aggregate = rp->aggregate) != NULL) {
p = (struct prefix_ipv6 *)&rp->p;
@@ -2125,13 +2124,13 @@ DEFUN (clear_ipv6_rip,
IPV6_STR
"Clear IPv6 RIP database\n")
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct list *list;
struct listnode *listnode;
/* Clear received RIPng routes */
- for (rp = route_top(ripng->table); rp; rp = route_next(rp)) {
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp)) {
list = rp->info;
if (list == NULL)
continue;
@@ -2155,7 +2154,7 @@ DEFUN (clear_ipv6_rip,
if (list_isempty(list)) {
list_delete_and_null(&list);
rp->info = NULL;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
}
@@ -2206,7 +2205,7 @@ DEFUN (ripng_route,
int idx_ipv6addr = 1;
int ret;
struct prefix_ipv6 p;
- struct route_node *rp;
+ struct agg_node *rp;
ret = str2prefix_ipv6(argv[idx_ipv6addr]->arg,
(struct prefix_ipv6 *)&p);
@@ -2216,10 +2215,10 @@ DEFUN (ripng_route,
}
apply_mask_ipv6(&p);
- rp = route_node_get(ripng->route, (struct prefix *)&p);
+ rp = agg_node_get(ripng->route, (struct prefix *)&p);
if (rp->info) {
vty_out(vty, "There is already same static route.\n");
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return CMD_WARNING;
}
rp->info = (void *)1;
@@ -2240,7 +2239,7 @@ DEFUN (no_ripng_route,
int idx_ipv6addr = 2;
int ret;
struct prefix_ipv6 p;
- struct route_node *rp;
+ struct agg_node *rp;
ret = str2prefix_ipv6(argv[idx_ipv6addr]->arg,
(struct prefix_ipv6 *)&p);
@@ -2250,17 +2249,17 @@ DEFUN (no_ripng_route,
}
apply_mask_ipv6(&p);
- rp = route_node_lookup(ripng->route, (struct prefix *)&p);
+ rp = agg_node_lookup(ripng->route, (struct prefix *)&p);
if (!rp) {
vty_out(vty, "Can't find static route.\n");
return CMD_WARNING_CONFIG_FAILED;
}
ripng_redistribute_delete(ZEBRA_ROUTE_RIPNG, RIPNG_ROUTE_STATIC, &p, 0);
- route_unlock_node(rp);
+ agg_unlock_node(rp);
rp->info = NULL;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
return CMD_SUCCESS;
}
@@ -2274,7 +2273,7 @@ DEFUN (ripng_aggregate_address,
int idx_ipv6_prefixlen = 1;
int ret;
struct prefix p;
- struct route_node *node;
+ struct agg_node *node;
ret = str2prefix_ipv6(argv[idx_ipv6_prefixlen]->arg,
(struct prefix_ipv6 *)&p);
@@ -2284,10 +2283,10 @@ DEFUN (ripng_aggregate_address,
}
/* Check aggregate alredy exist or not. */
- node = route_node_get(ripng->aggregate, &p);
+ node = agg_node_get(ripng->aggregate, &p);
if (node->info) {
vty_out(vty, "There is already same aggregate route.\n");
- route_unlock_node(node);
+ agg_unlock_node(node);
return CMD_WARNING;
}
node->info = (void *)1;
@@ -2307,7 +2306,7 @@ DEFUN (no_ripng_aggregate_address,
int idx_ipv6_prefixlen = 2;
int ret;
struct prefix p;
- struct route_node *rn;
+ struct agg_node *rn;
ret = str2prefix_ipv6(argv[idx_ipv6_prefixlen]->arg,
(struct prefix_ipv6 *)&p);
@@ -2316,14 +2315,14 @@ DEFUN (no_ripng_aggregate_address,
return CMD_WARNING_CONFIG_FAILED;
}
- rn = route_node_lookup(ripng->aggregate, &p);
+ rn = agg_node_lookup(ripng->aggregate, &p);
if (!rn) {
vty_out(vty, "Can't find aggregate route.\n");
return CMD_WARNING_CONFIG_FAILED;
}
- route_unlock_node(rn);
+ agg_unlock_node(rn);
rn->info = NULL;
- route_unlock_node(rn);
+ agg_unlock_node(rn);
ripng_aggregate_delete(&p);
@@ -2582,7 +2581,7 @@ DEFUN (no_ripng_default_information_originate,
/* Update ECMP routes to zebra when ECMP is disabled. */
static void ripng_ecmp_disable(void)
{
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo, *tmp_rinfo;
struct list *list;
struct listnode *node, *nextnode;
@@ -2590,7 +2589,7 @@ static void ripng_ecmp_disable(void)
if (!ripng)
return;
- for (rp = route_top(ripng->table); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->table); rp; rp = agg_route_next(rp))
if ((list = rp->info) != NULL && listcount(list) > 1) {
rinfo = listgetdata(listhead(list));
if (!ripng_route_rte(rinfo))
@@ -2655,7 +2654,7 @@ static int ripng_config_write(struct vty *vty)
int ripng_network_write(struct vty *, int);
void ripng_redistribute_write(struct vty *, int);
int write = 0;
- struct route_node *rp;
+ struct agg_node *rp;
if (ripng) {
@@ -2678,7 +2677,8 @@ static int ripng_config_write(struct vty *vty)
config_write_ripng_offset_list(vty);
/* RIPng aggregate routes. */
- for (rp = route_top(ripng->aggregate); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->aggregate); rp;
+ rp = agg_route_next(rp))
if (rp->info != NULL)
vty_out(vty, " aggregate-address %s/%d\n",
inet6_ntoa(rp->p.u.prefix6),
@@ -2689,7 +2689,8 @@ static int ripng_config_write(struct vty *vty)
vty_out(vty, " allow-ecmp\n");
/* RIPng static routes. */
- for (rp = route_top(ripng->route); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->route); rp;
+ rp = agg_route_next(rp))
if (rp->info != NULL)
vty_out(vty, " route %s/%d\n",
inet6_ntoa(rp->p.u.prefix6),
@@ -2811,7 +2812,7 @@ static void ripng_distribute_update_all_wrapper(struct access_list *notused)
void ripng_clean()
{
int i;
- struct route_node *rp;
+ struct agg_node *rp;
struct ripng_info *rinfo;
struct ripng_aggregate *aggregate;
struct list *list = NULL;
@@ -2819,7 +2820,8 @@ void ripng_clean()
if (ripng) {
/* Clear RIPng routes */
- for (rp = route_top(ripng->table); rp; rp = route_next(rp)) {
+ for (rp = agg_route_top(ripng->table); rp;
+ rp = agg_route_next(rp)) {
if ((list = rp->info) != NULL) {
rinfo = listgetdata(listhead(list));
if (ripng_route_rte(rinfo))
@@ -2834,13 +2836,13 @@ void ripng_clean()
}
list_delete_and_null(&list);
rp->info = NULL;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
if ((aggregate = rp->aggregate) != NULL) {
ripng_aggregate_free(aggregate);
rp->aggregate = NULL;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
}
@@ -2862,17 +2864,19 @@ void ripng_clean()
}
/* Static RIPng route configuration. */
- for (rp = route_top(ripng->route); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->route); rp;
+ rp = agg_route_next(rp))
if (rp->info) {
rp->info = NULL;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
/* RIPng aggregated prefixes */
- for (rp = route_top(ripng->aggregate); rp; rp = route_next(rp))
+ for (rp = agg_route_top(ripng->aggregate); rp;
+ rp = agg_route_next(rp))
if (rp->info) {
rp->info = NULL;
- route_unlock_node(rp);
+ agg_unlock_node(rp);
}
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
diff --git a/ripngd/ripngd.h b/ripngd/ripngd.h
index 534905d895..1095a33494 100644
--- a/ripngd/ripngd.h
+++ b/ripngd/ripngd.h
@@ -109,13 +109,13 @@ struct ripng {
struct stream *obuf;
/* RIPng routing information base. */
- struct route_table *table;
+ struct agg_table *table;
/* RIPng only static route information. */
- struct route_table *route;
+ struct agg_table *route;
/* RIPng aggregate route information. */
- struct route_table *aggregate;
+ struct agg_table *aggregate;
/* RIPng threads. */
struct thread *t_read;
@@ -198,7 +198,7 @@ struct ripng_info {
uint8_t metric_out;
uint16_t tag_out;
- struct route_node *rp;
+ struct agg_node *rp;
};
#ifdef notyet
@@ -377,8 +377,8 @@ extern void ripng_redistribute_withdraw(int type);
extern void ripng_distribute_update_interface(struct interface *);
extern void ripng_if_rmap_update_interface(struct interface *);
-extern void ripng_zebra_ipv6_add(struct route_node *);
-extern void ripng_zebra_ipv6_delete(struct route_node *);
+extern void ripng_zebra_ipv6_add(struct agg_node *node);
+extern void ripng_zebra_ipv6_delete(struct agg_node *node);
extern void ripng_redistribute_clean(void);
extern int ripng_redistribute_check(int);
diff --git a/solaris/.gitignore b/solaris/.gitignore
index a2c7946e71..a249b61996 100644
--- a/solaris/.gitignore
+++ b/solaris/.gitignore
@@ -1,5 +1,5 @@
Makefile
-Makefile.in
+!Makefile.in
?.manifest
*.xml
pkginfo.*.full
@@ -19,4 +19,4 @@ frr.init
*.pkg.gz
*~
*.loT
-*.a \ No newline at end of file
+*.a
diff --git a/solaris/Makefile.am b/solaris/Makefile.in
index 5633991d1a..df9122a1db 100644
--- a/solaris/Makefile.am
+++ b/solaris/Makefile.in
@@ -2,13 +2,56 @@
# XXX This file uses GNU make extensions.
-.PHONY: packages
+.PHONY: packages all all-files
+
+all: all-files
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+includedir = @includedir@
+infodir = @infodir@
+mandir = @mandir@
+frr_statedir = @frr_statedir@
+
+builddir = @builddir@
+srcdir = @srcdir@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+
+enable_user = @enable_user@
+enable_group = @enable_group@
+enable_vty_group = @enable_vty_group@
+
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+CONFDATE = @CONFDATE@
+
+host_cpu = @host_cpu@
+host_os = @host_os@
+
+SED = @SED@
+MAKE = @MAKE@
# the names of the various subpackages, and some convenient
# derived variables.
pkg_names = daemons dev doc libs smf
pkg_frr_daemons = zebra bgpd ospfd ospf6d ripd ripngd
-pkg_name_rev = @PACKAGE_VERSION@-@CONFDATE@-@target_os@-@target_cpu@
+pkg_name_rev = $(PACKAGE_VERSION)-$(CONFDATE)-$(host_os)-$(host_cpu)
pkg_depends = $(pkg_names:%=depend.%)
pkg_packages = $(pkg_names:%=@PACKAGE_TARNAME@-%-$(pkg_name_rev).pkg)
pkg_pkginfos = $(pkg_names:%=pkginfo.%.full)
@@ -36,29 +79,28 @@ edit = $(SED) \
-e 's,@enable_group\@,$(enable_group),g' \
-e 's,@enable_vty_group\@,$(enable_vty_group),g' \
-e 's,@frr_statedir\@,$(frr_statedir),g' \
- -e 's,[@]PACKAGE_NAME[@],@PACKAGE_NAME@,g' \
- -e 's,[@]PACKAGE_TARNAME[@],@PACKAGE_TARNAME@,g' \
- -e 's,[@]PACKAGE_VERSION[@],@PACKAGE_VERSION@,g' \
- -e 's,[@]PACKAGE_BUGREPORT[@],@PACKAGE_BUGREPORT@,g' \
- -e 's,[@]CONFDATE[@],@CONFDATE@,g' \
- -e 's,[@]target_cpu[@],$(target_cpu),g' \
- -e 's,[@]target_host[@],$(target_host),g' \
- -e 's,[@]target_os[@],$(target_os),g'
+ -e 's,[@]PACKAGE_NAME[@],$(PACKAGE_NAME),g' \
+ -e 's,[@]PACKAGE_TARNAME[@],$(PACKAGE_TARNAME),g' \
+ -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \
+ -e 's,[@]PACKAGE_BUGREPORT[@],$(PACKAGE_BUGREPORT),g' \
+ -e 's,[@]CONFDATE[@],$(CONFDATE),g' \
+ -e 's,[@]host_cpu[@],$(host_cpu),g' \
+ -e 's,[@]host_os[@],$(host_os),g'
# common options for pkgmk
-pkg_make_vars = exec_prefix=@exec_prefix@ prefix=@prefix@ \
- builddir=@builddir@ srcdir=@srcdir@ \
- top_builddir=@top_builddir@ top_srcdir=@top_srcdir@ \
- abs_builddir=@abs_builddir@ abs_srcdir=@abs_srcdir@ \
- abs_top_builddir=@abs_top_builddir@ abs_top_srcdir=@abs_top_srcdir@
+pkg_make_vars = exec_prefix=$(exec_prefix) prefix=$(prefix) \
+ builddir=$(builddir) srcdir=$(srcdir) \
+ top_builddir=$(top_builddir) top_srcdir=$(top_srcdir) \
+ abs_builddir=$(abs_builddir) abs_srcdir=$(abs_srcdir) \
+ abs_top_builddir=$(abs_top_builddir) abs_top_srcdir=$(abs_top_srcdir)
# pkgmk: write the package to spool in build dir, to avoid root dependencies
-pkg_make = pkgmk -o -d @abs_builddir@ \
+pkg_make = pkgmk -o -d $(abs_builddir) \
-f $< DESTDIR="$(DESTDIR)/" $(pkg_make_vars)
# pkgtrans: write a pkg file stream, shame we cant pipe directly to it from
# pkgmk..
-pkg_trans = pkgtrans -s @abs_builddir@ "@abs_builddir@/$@"
+pkg_trans = pkgtrans -s $(abs_builddir) "$(abs_builddir)/$@"
# pkgmk can only cope with a single pkginfo, cant 'stack' various
# pkginfo template files and a package specific pkginfo file in the prototype
@@ -95,7 +137,7 @@ frr.init: $(srcdir)/frr.init.in Makefile
$(edit) $< > $@
# construct the pkg
-@PACKAGE_TARNAME@-%-$(pkg_name_rev).pkg: prototype.% \
+$(PACKAGE_TARNAME)-%-$(pkg_name_rev).pkg: prototype.% \
depend.% frr.init pkginfo.%.full
($(pkg_make) && \
$(pkg_trans) "FRR$*")
@@ -103,22 +145,11 @@ frr.init: $(srcdir)/frr.init.in Makefile
%.pkg.gz : %.pkg
(gzip -c $< > $@)
-# pkginfo.package and prototype.package are all built sources
-#BUILT_SOURCES = pkginfo.daemons pkginfo.dev pkginfo.doc pkginfo.libs \
-# prototype.daemons prototype.dev prototype.doc prototype.libs
-BUILT_SOURCES = $(pkg_pkginfos) pkginfo.tmpl $(pkg_prototypes) \
- $(pkg_manifests) $(pkg_depends) frr.init
-
-CLEANFILES = $(BUILT_SOURCES) $(pkg_packages)
-
-EXTRA_DIST = $(pkg_manifests:%=%.in) $(pkg_prototypes:%=%.in) \
- $(pkg_names:%=pkginfo.%.tmpl.in) $(srcdir)/pkginfo.tmpl.in \
- $(pkg_depends:%=%.in) frr.init.in README.txt
-
pkg-root-install:
(cd $(top_builddir) && \
$(MAKE) DESTDIR=$(abs_builddir)/frr-root install)
packages: $(pkg_packages)
-#nodist_pkgdata_DATA = $(pkg_packages)
+all-files: $(pkg_pkginfos) pkginfo.tmpl $(pkg_prototypes) \
+ $(pkg_manifests) $(pkg_depends) frr.init
diff --git a/solaris/pkginfo.tmpl.in b/solaris/pkginfo.tmpl.in
index 89a281ceb6..ffbf9b9cef 100644
--- a/solaris/pkginfo.tmpl.in
+++ b/solaris/pkginfo.tmpl.in
@@ -1,4 +1,4 @@
-ARCH="@target_cpu@"
+ARCH="@host_cpu@"
CATEGORY="system"
VERSION="@PACKAGE_VERSION@,REV=@CONFDATE@"
VENDOR="http://www.frrouting.org/"
diff --git a/solaris/subdir.am b/solaris/subdir.am
new file mode 100644
index 0000000000..1d19d56a4d
--- /dev/null
+++ b/solaris/subdir.am
@@ -0,0 +1,53 @@
+#
+# solaris
+#
+
+.PHONY: solaris/all
+if SOLARIS
+all: solaris/all
+solaris/all:
+ @make -s -C solaris all
+endif
+
+CLEANFILES += \
+ solaris/frr.xml \
+ solaris/frr.init \
+ solaris/pkginfo.tmpl \
+ solaris/prototype.daemons \
+ solaris/prototype.dev \
+ solaris/prototype.doc \
+ solaris/prototype.libs \
+ solaris/prototype.smf \
+ solaris/pkginfo.daemons.tmpl \
+ solaris/pkginfo.dev.tmpl \
+ solaris/pkginfo.doc.tmpl \
+ solaris/pkginfo.libs.tmpl \
+ solaris/pkginfo.smf.tmpl \
+ solaris/depend.daemons \
+ solaris/depend.dev \
+ solaris/depend.doc \
+ solaris/depend.libs \
+ solaris/depend.smf \
+ # end
+
+EXTRA_DIST += \
+ solaris/frr.xml.in \
+ solaris/frr.init.in \
+ solaris/pkginfo.tmpl.in \
+ solaris/prototype.daemons.in \
+ solaris/prototype.dev.in \
+ solaris/prototype.doc.in \
+ solaris/prototype.libs.in \
+ solaris/prototype.smf.in \
+ solaris/pkginfo.daemons.tmpl.in \
+ solaris/pkginfo.dev.tmpl.in \
+ solaris/pkginfo.doc.tmpl.in \
+ solaris/pkginfo.libs.tmpl.in \
+ solaris/pkginfo.smf.tmpl.in \
+ solaris/depend.daemons.in \
+ solaris/depend.dev.in \
+ solaris/depend.doc.in \
+ solaris/depend.libs.in \
+ solaris/depend.smf.in \
+ solaris/README.txt \
+ # end
diff --git a/staticd/static_nht.c b/staticd/static_nht.c
index c6e4587b6a..44f7fb79da 100644
--- a/staticd/static_nht.c
+++ b/staticd/static_nht.c
@@ -29,8 +29,8 @@
#include "static_zebra.h"
#include "static_nht.h"
-void static_nht_update(struct prefix *p, uint32_t nh_num,
- afi_t afi, vrf_id_t vrf_id)
+void static_nht_update(struct prefix *p, uint32_t nh_num, afi_t afi,
+ vrf_id_t nh_vrf_id)
{
struct route_table *stable;
struct static_route *si;
@@ -40,41 +40,47 @@ void static_nht_update(struct prefix *p, uint32_t nh_num,
bool orig;
bool reinstall;
- vrf = vrf_lookup_by_id(vrf_id);
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ svrf = vrf->info;
+ if (!svrf)
+ continue;
- if (!vrf || !vrf->info)
- return;
+ stable = static_vrf_static_table(afi, SAFI_UNICAST, svrf);
+ if (!stable)
+ continue;
- svrf = vrf->info;
- stable = static_vrf_static_table(afi, SAFI_UNICAST, svrf);
- if (!stable)
- return;
+ for (rn = route_top(stable); rn; rn = route_next(rn)) {
+ reinstall = false;
+ for (si = rn->info; si; si = si->next) {
+ if (si->nh_vrf_id != nh_vrf_id)
+ continue;
- for (rn = route_top(stable); rn; rn = route_next(rn)) {
- reinstall = false;
- for (si = rn->info; si; si = si->next) {
- if (si->type != STATIC_IPV4_GATEWAY &&
- si->type != STATIC_IPV4_GATEWAY_IFNAME &&
- si->type != STATIC_IPV6_GATEWAY &&
- si->type != STATIC_IPV6_GATEWAY_IFNAME)
- continue;
+ if (si->type != STATIC_IPV4_GATEWAY
+ && si->type != STATIC_IPV4_GATEWAY_IFNAME
+ && si->type != STATIC_IPV6_GATEWAY
+ && si->type != STATIC_IPV6_GATEWAY_IFNAME)
+ continue;
- orig = si->nh_valid;
- if (p->family == AF_INET &&
- p->u.prefix4.s_addr == si->addr.ipv4.s_addr)
- si->nh_valid = !!nh_num;
+ orig = si->nh_valid;
+ if (p->family == AF_INET
+ && p->u.prefix4.s_addr
+ == si->addr.ipv4.s_addr)
+ si->nh_valid = !!nh_num;
- if (p->family == AF_INET6 &&
- memcmp(&p->u.prefix6, &si->addr.ipv6, 16) == 0)
- si->nh_valid = !!nh_num;
+ if (p->family == AF_INET6
+ && memcmp(&p->u.prefix6, &si->addr.ipv6, 16)
+ == 0)
+ si->nh_valid = !!nh_num;
- if (orig != si->nh_valid)
- reinstall = true;
+ if (orig != si->nh_valid)
+ reinstall = true;
- if (reinstall) {
- static_zebra_route_add(rn, si, vrf_id,
- SAFI_UNICAST, true);
- reinstall = false;
+ if (reinstall) {
+ static_zebra_route_add(
+ rn, si, vrf->vrf_id,
+ SAFI_UNICAST, true);
+ reinstall = false;
+ }
}
}
}
diff --git a/staticd/static_vrf.c b/staticd/static_vrf.c
index d33c1539c8..ad143209ee 100644
--- a/staticd/static_vrf.c
+++ b/staticd/static_vrf.c
@@ -153,12 +153,18 @@ static int static_vrf_config_write(struct vty *vty)
struct vrf *vrf;
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (vrf->vrf_id != VRF_DEFAULT)
+ vty_frame(vty, "vrf %s\n", vrf->name);
+
static_config(vty, vrf->info, AFI_IP,
SAFI_UNICAST, "ip route");
static_config(vty, vrf->info, AFI_IP,
SAFI_MULTICAST, "ip mroute");
static_config(vty, vrf->info, AFI_IP6,
SAFI_UNICAST, "ipv6 route");
+
+ if (vrf->vrf_id != VRF_DEFAULT)
+ vty_endframe(vty, "!\n");
}
return 0;
diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c
index a87dc074df..4692dc00d7 100644
--- a/staticd/static_zebra.c
+++ b/staticd/static_zebra.c
@@ -35,6 +35,7 @@
#include "nexthop.h"
#include "nexthop_group.h"
#include "hash.h"
+#include "jhash.h"
#include "static_vrf.h"
#include "static_routes.h"
@@ -180,6 +181,9 @@ static void zebra_connected(struct zclient *zclient)
struct static_nht_data {
struct prefix *nh;
+
+ vrf_id_t nh_vrf_id;
+
uint32_t refcount;
uint8_t nh_num;
};
@@ -201,13 +205,18 @@ static int static_zebra_nexthop_update(int command, struct zclient *zclient,
memset(&lookup, 0, sizeof(lookup));
lookup.nh = &nhr.prefix;
+ lookup.nh_vrf_id = vrf_id;
nhtd = hash_lookup(static_nht_hash, &lookup);
- if (nhtd)
+
+ if (nhtd) {
nhtd->nh_num = nhr.nexthop_num;
+ static_nht_update(&nhr.prefix, nhr.nexthop_num, afi,
+ nhtd->nh_vrf_id);
+ } else
+ zlog_err("No nhtd?");
- static_nht_update(&nhr.prefix, nhr.nexthop_num, afi, vrf_id);
return 1;
}
@@ -219,8 +228,10 @@ static void static_zebra_capabilities(struct zclient_capabilities *cap)
static unsigned int static_nht_hash_key(void *data)
{
struct static_nht_data *nhtd = data;
+ unsigned int key = 0;
- return prefix_hash_key(nhtd->nh);
+ key = prefix_hash_key(nhtd->nh);
+ return jhash_1word(nhtd->nh_vrf_id, key);
}
static int static_nht_hash_cmp(const void *d1, const void *d2)
@@ -228,6 +239,9 @@ static int static_nht_hash_cmp(const void *d1, const void *d2)
const struct static_nht_data *nhtd1 = d1;
const struct static_nht_data *nhtd2 = d2;
+ if (nhtd1->nh_vrf_id != nhtd2->nh_vrf_id)
+ return 0;
+
return prefix_same(nhtd1->nh, nhtd2->nh);
}
@@ -242,6 +256,7 @@ static void *static_nht_hash_alloc(void *data)
prefix_copy(new->nh, copy->nh);
new->refcount = 0;
new->nh_num = 0;
+ new->nh_vrf_id = copy->nh_vrf_id;
return new;
}
@@ -293,6 +308,7 @@ void static_zebra_nht_register(struct static_route *si, bool reg)
memset(&lookup, 0, sizeof(lookup));
lookup.nh = &p;
+ lookup.nh_vrf_id = si->nh_vrf_id;
si->nh_registered = reg;
diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h
index c8e4c025e0..5bff01a506 100644
--- a/vtysh/vtysh.h
+++ b/vtysh/vtysh.h
@@ -53,7 +53,7 @@ DECLARE_MGROUP(MVTYSH)
#define VTYSH_RMAP VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_EIGRPD|VTYSH_SHARPD
#define VTYSH_INTERFACE VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_ISISD|VTYSH_PIMD|VTYSH_NHRPD|VTYSH_EIGRPD|VTYSH_BABELD|VTYSH_PBRD
#define VTYSH_NS VTYSH_ZEBRA
-#define VTYSH_VRF VTYSH_ZEBRA|VTYSH_PIMD
+#define VTYSH_VRF VTYSH_ZEBRA|VTYSH_PIMD|VTYSH_STATICD
enum vtysh_write_integrated {
WRITE_INTEGRATED_UNSPECIFIED,
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index a15d914243..0dcf5082a2 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -259,6 +259,8 @@ static void netlink_determine_zebra_iftype(char *kind, zebra_iftype_t *zif_type)
*zif_type = ZEBRA_IF_VXLAN;
else if (strcmp(kind, "macvlan") == 0)
*zif_type = ZEBRA_IF_MACVLAN;
+ else if (strcmp(kind, "veth") == 0)
+ *zif_type = ZEBRA_IF_VETH;
}
#define parse_rtattr_nested(tb, max, rta) \
@@ -675,7 +677,7 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK);
/* Update link. */
- zebra_if_update_link(ifp, link_ifindex);
+ zebra_if_update_link(ifp, link_ifindex, ns_id);
/* Hardware type and address. */
ifp->ll_type = netlink_to_zebra_link_type(ifi->ifi_type);
@@ -1262,7 +1264,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
ZEBRA_INTERFACE_VRF_LOOPBACK);
/* Update link. */
- zebra_if_update_link(ifp, link_ifindex);
+ zebra_if_update_link(ifp, link_ifindex, ns_id);
netlink_interface_update_hw_addr(tb, ifp);
diff --git a/zebra/interface.c b/zebra/interface.c
index 763931d350..32ee1a566a 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -1002,13 +1002,16 @@ void if_refresh(struct interface *ifp)
if_get_flags(ifp);
}
-void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex)
+void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,
+ ns_id_t ns_id)
{
struct zebra_if *zif;
+ if (IS_ZEBRA_IF_VETH(ifp))
+ return;
zif = (struct zebra_if *)ifp->info;
zif->link_ifindex = link_ifindex;
- zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
+ zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id),
link_ifindex);
}
@@ -1093,6 +1096,10 @@ static const char *zebra_ziftype_2str(zebra_iftype_t zif_type)
return "VRF";
break;
+ case ZEBRA_IF_VETH:
+ return "VETH";
+ break;
+
default:
return "Unknown";
break;
diff --git a/zebra/interface.h b/zebra/interface.h
index 9634bfdb3f..956d430cf9 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -191,6 +191,7 @@ typedef enum {
ZEBRA_IF_BRIDGE, /* bridge device */
ZEBRA_IF_VLAN, /* VLAN sub-interface */
ZEBRA_IF_MACVLAN, /* MAC VLAN interface*/
+ ZEBRA_IF_VETH, /* VETH interface*/
} zebra_iftype_t;
/* Zebra "slave" interface type */
@@ -312,7 +313,10 @@ static inline void zebra_if_set_ziftype(struct interface *ifp,
#define IS_ZEBRA_IF_MACVLAN(ifp) \
(((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_MACVLAN)
-#define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) \
+#define IS_ZEBRA_IF_VETH(ifp) \
+ (((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_VETH)
+
+#define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) \
(((struct zebra_if *)(ifp->info))->zif_slave_type \
== ZEBRA_IF_SLAVE_BRIDGE)
@@ -344,7 +348,8 @@ extern int if_subnet_add(struct interface *, struct connected *);
extern int if_subnet_delete(struct interface *, struct connected *);
extern int ipv6_address_configured(struct interface *ifp);
extern void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id);
-extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex);
+extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,
+ ns_id_t ns_id);
extern void vrf_add_update(struct vrf *vrfp);
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c
index f7283aed36..8f48cc5191 100644
--- a/zebra/zebra_mpls.c
+++ b/zebra/zebra_mpls.c
@@ -2698,7 +2698,7 @@ void zebra_mpls_lsp_schedule(struct zebra_vrf *zvrf)
* (VTY command handler).
*/
void zebra_mpls_print_lsp(struct vty *vty, struct zebra_vrf *zvrf,
- mpls_label_t label, uint8_t use_json)
+ mpls_label_t label, bool use_json)
{
struct hash *lsp_table;
zebra_lsp_t *lsp;
@@ -2729,7 +2729,7 @@ void zebra_mpls_print_lsp(struct vty *vty, struct zebra_vrf *zvrf,
* Display MPLS label forwarding table (VTY command handler).
*/
void zebra_mpls_print_lsp_table(struct vty *vty, struct zebra_vrf *zvrf,
- uint8_t use_json)
+ bool use_json)
{
char buf[BUFSIZ];
json_object *json = NULL;
diff --git a/zebra/zebra_mpls.h b/zebra/zebra_mpls.h
index 65204a67dc..86bee129cf 100644
--- a/zebra/zebra_mpls.h
+++ b/zebra/zebra_mpls.h
@@ -349,13 +349,13 @@ void zebra_mpls_lsp_schedule(struct zebra_vrf *zvrf);
* (VTY command handler).
*/
void zebra_mpls_print_lsp(struct vty *vty, struct zebra_vrf *zvrf,
- mpls_label_t label, uint8_t use_json);
+ mpls_label_t label, bool use_json);
/*
* Display MPLS label forwarding table (VTY command handler).
*/
void zebra_mpls_print_lsp_table(struct vty *vty, struct zebra_vrf *zvrf,
- uint8_t use_json);
+ bool use_json);
/*
* Display MPLS LSP configuration of all static LSPs (VTY command handler).
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c
index 4f1d5cf6d5..de08e323af 100644
--- a/zebra/zebra_vty.c
+++ b/zebra/zebra_vty.c
@@ -55,7 +55,7 @@
extern int allow_delete;
static int do_show_ip_route(struct vty *vty, const char *vrf_name, afi_t afi,
- safi_t safi, bool use_fib, uint8_t use_json,
+ safi_t safi, bool use_fib, bool use_json,
route_tag_t tag,
const struct prefix *longer_prefix_p,
bool supernets_only, int type,
@@ -135,7 +135,7 @@ DEFUN (show_ip_rpf,
"Display RPF information for multicast source\n"
JSON_STR)
{
- int uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
return do_show_ip_route(vty, VRF_DEFAULT_NAME, AFI_IP, SAFI_MULTICAST,
false, uj, 0, NULL, false, 0, 0);
}
@@ -760,8 +760,7 @@ static void do_show_route_helper(struct vty *vty, struct zebra_vrf *zvrf,
bool use_fib, route_tag_t tag,
const struct prefix *longer_prefix_p,
bool supernets_only, int type,
- unsigned short ospf_instance_id,
- uint8_t use_json)
+ unsigned short ospf_instance_id, bool use_json)
{
struct route_node *rn;
struct route_entry *re;
@@ -850,7 +849,7 @@ static void do_show_route_helper(struct vty *vty, struct zebra_vrf *zvrf,
}
static int do_show_ip_route(struct vty *vty, const char *vrf_name, afi_t afi,
- safi_t safi, bool use_fib, uint8_t use_json,
+ safi_t safi, bool use_fib, bool use_json,
route_tag_t tag,
const struct prefix *longer_prefix_p,
bool supernets_only, int type,
@@ -1723,7 +1722,7 @@ DEFUN (show_vrf_vni,
struct zebra_vrf *zvrf;
json_object *json = NULL;
json_object *json_vrfs = NULL;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (uj) {
json = json_object_new_object();
@@ -1759,7 +1758,7 @@ DEFUN (show_evpn_global,
"EVPN\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
zebra_vxlan_print_evpn(vty, uj);
return CMD_SUCCESS;
@@ -1774,7 +1773,7 @@ DEFUN (show_evpn_vni,
JSON_STR)
{
struct zebra_vrf *zvrf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
zvrf = vrf_info_lookup(VRF_DEFAULT);
zebra_vxlan_print_vnis(vty, zvrf, uj);
@@ -1792,7 +1791,7 @@ DEFUN (show_evpn_vni_vni,
{
struct zebra_vrf *zvrf;
vni_t vni;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
vni = strtoul(argv[3]->arg, NULL, 10);
zvrf = vrf_info_lookup(VRF_DEFAULT);
@@ -1814,7 +1813,7 @@ DEFUN (show_evpn_rmac_vni_mac,
{
vni_t l3vni = 0;
struct ethaddr mac;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
l3vni = strtoul(argv[4]->arg, NULL, 10);
if (!prefix_str2mac(argv[6]->arg, &mac)) {
@@ -1836,7 +1835,7 @@ DEFUN (show_evpn_rmac_vni,
JSON_STR)
{
vni_t l3vni = 0;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
l3vni = strtoul(argv[4]->arg, NULL, 10);
zebra_vxlan_print_rmacs_l3vni(vty, l3vni, uj);
@@ -1854,7 +1853,7 @@ DEFUN (show_evpn_rmac_vni_all,
"All VNIs\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
zebra_vxlan_print_rmacs_all_l3vni(vty, uj);
@@ -1875,7 +1874,7 @@ DEFUN (show_evpn_nh_vni_ip,
{
vni_t l3vni;
struct ipaddr ip;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
l3vni = strtoul(argv[4]->arg, NULL, 10);
if (str2ipaddr(argv[6]->arg, &ip) != 0) {
@@ -1899,7 +1898,7 @@ DEFUN (show_evpn_nh_vni,
JSON_STR)
{
vni_t l3vni;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
l3vni = strtoul(argv[4]->arg, NULL, 10);
zebra_vxlan_print_nh_l3vni(vty, l3vni, uj);
@@ -1917,7 +1916,7 @@ DEFUN (show_evpn_nh_vni_all,
"All VNIs\n"
JSON_STR)
{
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
zebra_vxlan_print_nh_all_l3vni(vty, uj);
@@ -1936,7 +1935,7 @@ DEFUN (show_evpn_mac_vni,
{
struct zebra_vrf *zvrf;
vni_t vni;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
vni = strtoul(argv[4]->arg, NULL, 10);
zvrf = vrf_info_lookup(VRF_DEFAULT);
@@ -1955,7 +1954,7 @@ DEFUN (show_evpn_mac_vni_all,
JSON_STR)
{
struct zebra_vrf *zvrf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
zvrf = vrf_info_lookup(VRF_DEFAULT);
zebra_vxlan_print_macs_all_vni(vty, zvrf, uj);
@@ -1976,7 +1975,7 @@ DEFUN (show_evpn_mac_vni_all_vtep,
{
struct zebra_vrf *zvrf;
struct in_addr vtep_ip;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
if (!inet_aton(argv[6]->arg, &vtep_ip)) {
if (!uj)
@@ -2030,7 +2029,7 @@ DEFUN (show_evpn_mac_vni_vtep,
struct zebra_vrf *zvrf;
vni_t vni;
struct in_addr vtep_ip;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
vni = strtoul(argv[4]->arg, NULL, 10);
if (!inet_aton(argv[6]->arg, &vtep_ip)) {
@@ -2056,7 +2055,7 @@ DEFUN (show_evpn_neigh_vni,
{
struct zebra_vrf *zvrf;
vni_t vni;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
vni = strtoul(argv[4]->arg, NULL, 10);
zvrf = vrf_info_lookup(VRF_DEFAULT);
@@ -2075,7 +2074,7 @@ DEFUN (show_evpn_neigh_vni_all,
JSON_STR)
{
struct zebra_vrf *zvrf;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
zvrf = vrf_info_lookup(VRF_DEFAULT);
zebra_vxlan_print_neigh_all_vni(vty, zvrf, uj);
@@ -2097,7 +2096,7 @@ DEFUN (show_evpn_neigh_vni_neigh,
struct zebra_vrf *zvrf;
vni_t vni;
struct ipaddr ip;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
vni = strtoul(argv[4]->arg, NULL, 10);
if (str2ipaddr(argv[6]->arg, &ip) != 0) {
@@ -2125,7 +2124,7 @@ DEFUN (show_evpn_neigh_vni_vtep,
struct zebra_vrf *zvrf;
vni_t vni;
struct in_addr vtep_ip;
- uint8_t uj = use_json(argc, argv);
+ bool uj = use_json(argc, argv);
vni = strtoul(argv[4]->arg, NULL, 10);
if (!inet_aton(argv[6]->arg, &vtep_ip)) {
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c
index b0fc0a39bd..9aced13a4f 100644
--- a/zebra/zebra_vxlan.c
+++ b/zebra/zebra_vxlan.c
@@ -4057,8 +4057,7 @@ void zebra_vxlan_evpn_vrf_route_del(vrf_id_t vrf_id,
}
void zebra_vxlan_print_specific_rmac_l3vni(struct vty *vty, vni_t l3vni,
- struct ethaddr *rmac,
- uint8_t use_json)
+ struct ethaddr *rmac, bool use_json)
{
zebra_l3vni_t *zl3vni = NULL;
zebra_mac_t *zrmac = NULL;
@@ -4102,8 +4101,7 @@ void zebra_vxlan_print_specific_rmac_l3vni(struct vty *vty, vni_t l3vni,
}
}
-void zebra_vxlan_print_rmacs_l3vni(struct vty *vty, vni_t l3vni,
- uint8_t use_json)
+void zebra_vxlan_print_rmacs_l3vni(struct vty *vty, vni_t l3vni, bool use_json)
{
zebra_l3vni_t *zl3vni;
uint32_t num_rmacs;
@@ -4147,7 +4145,7 @@ void zebra_vxlan_print_rmacs_l3vni(struct vty *vty, vni_t l3vni,
}
}
-void zebra_vxlan_print_rmacs_all_l3vni(struct vty *vty, uint8_t use_json)
+void zebra_vxlan_print_rmacs_all_l3vni(struct vty *vty, bool use_json)
{
struct zebra_ns *zns = NULL;
json_object *json = NULL;
@@ -4184,7 +4182,7 @@ void zebra_vxlan_print_rmacs_all_l3vni(struct vty *vty, uint8_t use_json)
}
void zebra_vxlan_print_specific_nh_l3vni(struct vty *vty, vni_t l3vni,
- struct ipaddr *ip, uint8_t use_json)
+ struct ipaddr *ip, bool use_json)
{
zebra_l3vni_t *zl3vni = NULL;
zebra_neigh_t *n = NULL;
@@ -4228,7 +4226,7 @@ void zebra_vxlan_print_specific_nh_l3vni(struct vty *vty, vni_t l3vni,
}
}
-void zebra_vxlan_print_nh_l3vni(struct vty *vty, vni_t l3vni, uint8_t use_json)
+void zebra_vxlan_print_nh_l3vni(struct vty *vty, vni_t l3vni, bool use_json)
{
uint32_t num_nh;
struct nh_walk_ctx wctx;
@@ -4272,7 +4270,7 @@ void zebra_vxlan_print_nh_l3vni(struct vty *vty, vni_t l3vni, uint8_t use_json)
}
}
-void zebra_vxlan_print_nh_all_l3vni(struct vty *vty, uint8_t use_json)
+void zebra_vxlan_print_nh_all_l3vni(struct vty *vty, bool use_json)
{
struct zebra_ns *zns = NULL;
json_object *json = NULL;
@@ -4309,7 +4307,7 @@ void zebra_vxlan_print_nh_all_l3vni(struct vty *vty, uint8_t use_json)
/*
* Display L3 VNI information (VTY command handler).
*/
-void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni, uint8_t use_json)
+void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni, bool use_json)
{
void *args[2];
json_object *json = NULL;
@@ -4382,7 +4380,7 @@ void zebra_vxlan_print_vrf_vni(struct vty *vty, struct zebra_vrf *zvrf,
* Display Neighbors for a VNI (VTY command handler).
*/
void zebra_vxlan_print_neigh_vni(struct vty *vty, struct zebra_vrf *zvrf,
- vni_t vni, uint8_t use_json)
+ vni_t vni, bool use_json)
{
zebra_vni_t *zvni;
uint32_t num_neigh;
@@ -4438,7 +4436,7 @@ void zebra_vxlan_print_neigh_vni(struct vty *vty, struct zebra_vrf *zvrf,
* Display neighbors across all VNIs (VTY command handler).
*/
void zebra_vxlan_print_neigh_all_vni(struct vty *vty, struct zebra_vrf *zvrf,
- uint8_t use_json)
+ bool use_json)
{
json_object *json = NULL;
void *args[2];
@@ -4467,7 +4465,7 @@ void zebra_vxlan_print_neigh_all_vni(struct vty *vty, struct zebra_vrf *zvrf,
*/
void zebra_vxlan_print_specific_neigh_vni(struct vty *vty,
struct zebra_vrf *zvrf, vni_t vni,
- struct ipaddr *ip, uint8_t use_json)
+ struct ipaddr *ip, bool use_json)
{
zebra_vni_t *zvni;
zebra_neigh_t *n;
@@ -4509,7 +4507,7 @@ void zebra_vxlan_print_specific_neigh_vni(struct vty *vty,
*/
void zebra_vxlan_print_neigh_vni_vtep(struct vty *vty, struct zebra_vrf *zvrf,
vni_t vni, struct in_addr vtep_ip,
- uint8_t use_json)
+ bool use_json)
{
zebra_vni_t *zvni;
uint32_t num_neigh;
@@ -4551,7 +4549,7 @@ void zebra_vxlan_print_neigh_vni_vtep(struct vty *vty, struct zebra_vrf *zvrf,
* Display MACs for a VNI (VTY command handler).
*/
void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
- vni_t vni, uint8_t use_json)
+ vni_t vni, bool use_json)
{
zebra_vni_t *zvni;
uint32_t num_macs;
@@ -4606,7 +4604,7 @@ void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
* Display MACs for all VNIs (VTY command handler).
*/
void zebra_vxlan_print_macs_all_vni(struct vty *vty, struct zebra_vrf *zvrf,
- uint8_t use_json)
+ bool use_json)
{
struct mac_walk_ctx wctx;
json_object *json = NULL;
@@ -4636,8 +4634,7 @@ void zebra_vxlan_print_macs_all_vni(struct vty *vty, struct zebra_vrf *zvrf,
*/
void zebra_vxlan_print_macs_all_vni_vtep(struct vty *vty,
struct zebra_vrf *zvrf,
- struct in_addr vtep_ip,
- uint8_t use_json)
+ struct in_addr vtep_ip, bool use_json)
{
struct mac_walk_ctx wctx;
json_object *json = NULL;
@@ -4693,7 +4690,7 @@ void zebra_vxlan_print_specific_mac_vni(struct vty *vty, struct zebra_vrf *zvrf,
*/
void zebra_vxlan_print_macs_vni_vtep(struct vty *vty, struct zebra_vrf *zvrf,
vni_t vni, struct in_addr vtep_ip,
- uint8_t use_json)
+ bool use_json)
{
zebra_vni_t *zvni;
uint32_t num_macs;
@@ -4743,7 +4740,7 @@ void zebra_vxlan_print_macs_vni_vtep(struct vty *vty, struct zebra_vrf *zvrf,
* Display VNI information (VTY command handler).
*/
void zebra_vxlan_print_vni(struct vty *vty, struct zebra_vrf *zvrf, vni_t vni,
- uint8_t use_json)
+ bool use_json)
{
json_object *json = NULL;
void *args[2];
@@ -4831,7 +4828,7 @@ void zebra_vxlan_print_evpn(struct vty *vty, uint8_t uj)
* Display VNI hash table (VTY command handler).
*/
void zebra_vxlan_print_vnis(struct vty *vty, struct zebra_vrf *zvrf,
- uint8_t use_json)
+ bool use_json)
{
json_object *json = NULL;
struct zebra_ns *zns = NULL;
diff --git a/zebra/zebra_vxlan.h b/zebra/zebra_vxlan.h
index 2732ef72ed..6b2b57371c 100644
--- a/zebra/zebra_vxlan.h
+++ b/zebra/zebra_vxlan.h
@@ -68,53 +68,51 @@ extern int zebra_vxlan_vrf_enable(struct zebra_vrf *zvrf);
extern int zebra_vxlan_vrf_disable(struct zebra_vrf *zvrf);
extern int zebra_vxlan_vrf_delete(struct zebra_vrf *zvrf);
extern void zebra_vxlan_print_specific_nh_l3vni(struct vty *vty, vni_t l3vni,
- struct ipaddr *ip, uint8_t uj);
+ struct ipaddr *ip, bool uj);
extern void zebra_vxlan_print_evpn(struct vty *vty, uint8_t uj);
extern void zebra_vxlan_print_specific_rmac_l3vni(struct vty *vty, vni_t l3vni,
struct ethaddr *rmac,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_macs_vni(struct vty *vty, struct zebra_vrf *zvrf,
- vni_t vni, uint8_t use_json);
+ vni_t vni, bool use_json);
extern void zebra_vxlan_print_macs_all_vni(struct vty *vty,
struct zebra_vrf *zvrf,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_macs_all_vni_vtep(struct vty *vty,
struct zebra_vrf *zvrf,
struct in_addr vtep_ip,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_specific_mac_vni(struct vty *vty,
struct zebra_vrf *zvrf,
vni_t vni, struct ethaddr *mac);
extern void zebra_vxlan_print_macs_vni_vtep(struct vty *vty,
struct zebra_vrf *zvrf, vni_t vni,
struct in_addr vtep_ip,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_neigh_vni(struct vty *vty, struct zebra_vrf *zvrf,
- vni_t vni, uint8_t use_json);
+ vni_t vni, bool use_json);
extern void zebra_vxlan_print_neigh_all_vni(struct vty *vty,
struct zebra_vrf *zvrf,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_specific_neigh_vni(struct vty *vty,
struct zebra_vrf *zvrf,
vni_t vni, struct ipaddr *ip,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_neigh_vni_vtep(struct vty *vty,
struct zebra_vrf *zvrf, vni_t vni,
struct in_addr vtep_ip,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_vni(struct vty *vty, struct zebra_vrf *zvrf,
- vni_t vni, uint8_t use_json);
+ vni_t vni, bool use_json);
extern void zebra_vxlan_print_vnis(struct vty *vty, struct zebra_vrf *zvrf,
- uint8_t use_json);
+ bool use_json);
extern void zebra_vxlan_print_rmacs_l3vni(struct vty *vty, vni_t vni,
- uint8_t use_json);
-extern void zebra_vxlan_print_rmacs_all_l3vni(struct vty *vty,
- uint8_t use_json);
+ bool use_json);
+extern void zebra_vxlan_print_rmacs_all_l3vni(struct vty *vty, bool use_json);
extern void zebra_vxlan_print_nh_l3vni(struct vty *vty, vni_t vni,
- uint8_t use_json);
-extern void zebra_vxlan_print_nh_all_l3vni(struct vty *vty, uint8_t use_json);
-extern void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni,
- uint8_t use_json);
+ bool use_json);
+extern void zebra_vxlan_print_nh_all_l3vni(struct vty *vty, bool use_json);
+extern void zebra_vxlan_print_l3vni(struct vty *vty, vni_t vni, bool use_json);
extern void zebra_vxlan_print_vrf_vni(struct vty *vty, struct zebra_vrf *zvrf,
json_object *json_vrfs);
extern int zebra_vxlan_add_del_gw_macip(struct interface *ifp, struct prefix *p,
diff --git a/zebra/zserv.c b/zebra/zserv.c
index 174e010743..4a341bfe1b 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -705,7 +705,8 @@ static struct zserv *zserv_client_create(int sock)
.stop = frr_pthread_attr_default.stop
};
client->pthread =
- frr_pthread_new(&zclient_pthr_attrs, "Zebra API client thread");
+ frr_pthread_new(&zclient_pthr_attrs, "Zebra API client thread",
+ "zebra_apic");
zebra_vrf_update_all(client);