include $(TOPDIR)/rules.mk
PKG_NAME:=frr
-PKG_VERSION:=8.5.1
+PKG_VERSION:=10.2.1
PKG_RELEASE:=1
-PKG_SOURCE_DATE:=2023-05-12
+PKG_SOURCE_DATE:=2025-01-21
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_DATE).tar.gz
-PKG_SOURCE_VERSION:=05469ab2b553302c2a7032f4c89e4510dc3fa6d9
+PKG_SOURCE_VERSION:=989328c7e47c7bbcf3364d5424ac17f49fd05c57
PKG_SOURCE_URL:=https://codeload.github.com/FRRouting/frr/tar.gz/$(PKG_SOURCE_VERSION)?
-PKG_HASH:=caf3fcf1998ecd9a08e67373921a2d4bf49dbfc707008d20a1d38fd1606ef298
+PKG_HASH:=d8ea2bad243cfcfd96b9b4a5dd524fe1deeb577cd535529babe24a02cae26f06
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
CONFIG_FRR_INTERNAL \
CONFIG_FRR_SNMP \
CONFIG_FRR_NO_SNMP \
- CONFIG_PACKAGE_frr-libfrr \
- CONFIG_PACKAGE_frr-vtysh \
+ CONFIG_PACKAGE_frr \
CONFIG_PACKAGE_frr-watchfrr \
CONFIG_PACKAGE_frr-zebra \
$(patsubst %,CONFIG_PACKAGE_frr-%,$(PKG_DAEMON_AVAILABLE)) \
PKG_INSTALL:=1
PKG_BUILD_FLAGS:=lto
-PKG_BUILD_DEPENDS:=frr/host
+PKG_BUILD_DEPENDS:=frr/host protobuf-c/host
HOST_BUILD_DEPENDS:=python3/host
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk
-define Package/frr-libfrr/config
+define Package/frr/config
source "$(SOURCE)/Config.in"
endef
define Package/frr
$(call Package/frr/Default)
- DEPENDS:=+librt
+ DEPENDS:=+librt +libatomic +libcap +libncurses +libjson-c +libreadline \
+ +libyang +libprotobuf-c +FRR_OPENSSL:libopenssl +FRR_SNMP:libnetsnmp +more
TITLE:=The FRRouting (FRR) Software Routing Suite
MENU:=1
endef
NHRP.
endef
-define Package/frr-libfrr
- $(call Package/frr/Default)
- TITLE:=zebra library
- DEPENDS+=+librt +libatomic +libcap +libjson-c +libyang +FRR_OPENSSL:libopenssl +FRR_SNMP:libnetsnmp
- CONFLICTS:=quagga-libzebra
-endef
-
-define Package/frr-vtysh
- $(call Package/frr/Default)
- DEPENDS+=+frr-libfrr +libreadline +libncurses +more
- TITLE:=integrated shell for frr routing software
- CONFLICTS:=quagga-vtysh
-endef
-
define Package/frr-watchfrr
$(call Package/frr/Default)
TITLE:=frr watchdog
- DEPENDS+=+frr-libfrr
DEFAULT:=y if PACKAGE_frr
endef
define Package/frr-zebra
$(call Package/frr/Default)
TITLE:=Zebra daemon
- DEPENDS+=+frr-libfrr
DEFAULT:=y if PACKAGE_frr
CONFLICTS:=quagga-zebra
endef
define Package/frr-pythontools
$(call Package/frr/Default)
TITLE:=Python reload tool
- DEPENDS+=+frr-libfrr +python3-base +python3-light +python3-logging
+ DEPENDS+=+python3-base +python3-light +python3-logging
endef
##Migrate from quagga
define Package/frr-$(1)
$$(call Package/frr/Default)
TITLE:= $(1) routing engine
- DEPENDS+=frr-libfrr $(2)
+ifeq ($(1),bgpd)
+ KCONFIG:=CONFIG_TCP_MD5SIG=y
+endif
+ DEPENDS+=$(2)
endef
# if [ "$(1)" == "bfdd" ]; then \
# export HAVE_BFDD == 1 ; fi
$$(eval $$(call BuildPackage,frr-$(1)))
endef
-define Package/frr-libfrr/conffiles
+define Package/frr/conffiles
/etc/frr/daemons
/etc/frr/frr.conf
/etc/frr/vtysh.conf
HOST_CONFIGURE_ARGS+= \
--enable-clippy-only
+HOST_MAKE_FLAGS = \
+ LIBS+='-lz'
+
define Host/Install
$(INSTALL_DIR) $(STAGING_DIR_HOSTPKG)/bin
$(INSTALL_BIN) $(HOST_BUILD_DIR)/lib/clippy $(STAGING_DIR_HOSTPKG)/bin/
CONFIGURE_ARGS+= \
--with-clippy=$(STAGING_DIR_HOSTPKG)/bin/clippy \
--prefix=/usr \
+ --enable-vtysh \
+ --enable-zebra \
--enable-shared \
--disable-static \
--enable-user=network \
$(if $(CONFIG_FRR_OPENSSL),--with-crypto=openssl,) \
$(if $(CONFIG_FRR_SNMP),--enable-snmp,) \
$(foreach m,$(PKG_DAEMON_AVAILABLE), \
- $(call autoconf_bool,CONFIG_PACKAGE_frr-$(m),$(m)) ) \
- $(call autoconf_bool,CONFIG_PACKAGE_frr-vtysh,vtysh) \
- $(call autoconf_bool,CONFIG_PACKAGE_frr-libfrr,zebra)
+ $(call autoconf_bool,CONFIG_PACKAGE_frr-$(m),$(m)) )
define Package/frr/install
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d
$(INSTALL_BIN) ./files/frrcommon.sh $(1)/usr/sbin/
$(INSTALL_BIN) ./files/frr $(1)/etc/init.d/
+ $(INSTALL_DIR) $(1)/usr/bin $(1)/etc/frr
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/vtysh $(1)/usr/bin/
+ $(INSTALL_CONF) ./files/vtysh.conf $(1)/etc/frr/
+ $(INSTALL_DIR) $(1)/usr/lib $(1)/etc/frr
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfrr.so* $(1)/usr/lib/
+ $(if $(CONFIG_FRR_SNMP),$(CP) $(PKG_INSTALL_DIR)/usr/lib/libfrrsnmp.so* $(1)/usr/lib/,)
+ $(INSTALL_CONF) ./files/{frr.conf,daemons} $(1)/etc/frr/
endef
define Package/frr-watchfrr/install
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/zebra $(1)/usr/sbin/
endef
-define Package/frr-libfrr/install
- $(INSTALL_DIR) $(1)/usr/lib $(1)/etc/frr
- $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfrr.so* $(1)/usr/lib/
- $(if $(CONFIG_FRR_SNMP),$(CP) $(PKG_INSTALL_DIR)/usr/lib/libfrrsnmp.so* $(1)/usr/lib/,)
- $(INSTALL_CONF) ./files/{frr.conf,daemons} $(1)/etc/frr/
-endef
-
-
define Package/frr-pythontools/install
$(INSTALL_DIR) $(1)/usr/lib/frr $(1)/usr/sbin $(1)/etc/frr
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/*.py $(1)/usr/lib/frr/
$(INSTALL_CONF) $(PKG_BUILD_DIR)/tools/etc/frr/support_bundle_commands.conf $(1)/etc/frr/
endef
-define Package/frr-vtysh/install
- $(INSTALL_DIR) $(1)/usr/bin $(1)/etc/frr
- $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/vtysh $(1)/usr/bin/
- $(INSTALL_CONF) ./files/vtysh.conf $(1)/etc/frr/
-endef
-
$(eval $(call HostBuild))
$(eval $(call BuildPackage,frr))
-$(eval $(call BuildPackage,frr-libfrr))
$(eval $(call BuildPackage,frr-pythontools))
$(eval $(call BuildPackage,frr-watchfrr))
$(eval $(call BuildPackage,frr-zebra))
-$(eval $(call BuildPackage,frr-vtysh))
$(eval $(call BuildDaemon,babeld,))
$(eval $(call BuildDaemon,bfdd,))
$(eval $(call BuildDaemon,bgpd,))
+++ /dev/null
---- a/lib/thread.c
-+++ b/lib/thread.c
-@@ -868,13 +868,9 @@ static void thread_free(struct thread_ma
- XFREE(MTYPE_THREAD, thread);
- }
-
--static int fd_poll(struct thread_master *m, const struct timeval *timer_wait,
-- bool *eintr_p)
-+static int fd_poll(struct thread_master *m, struct pollfd *pfds, nfds_t pfdsize,
-+ nfds_t count, const struct timeval *timer_wait)
- {
-- sigset_t origsigs;
-- unsigned char trash[64];
-- nfds_t count = m->handler.copycount;
--
- /*
- * If timer_wait is null here, that means poll() should block
- * indefinitely, unless the thread_master has overridden it by setting
-@@ -905,58 +901,15 @@ static int fd_poll(struct thread_master
- rcu_assert_read_unlocked();
-
- /* add poll pipe poker */
-- assert(count + 1 < m->handler.pfdsize);
-- m->handler.copy[count].fd = m->io_pipe[0];
-- m->handler.copy[count].events = POLLIN;
-- m->handler.copy[count].revents = 0x00;
--
-- /* We need to deal with a signal-handling race here: we
-- * don't want to miss a crucial signal, such as SIGTERM or SIGINT,
-- * that may arrive just before we enter poll(). We will block the
-- * key signals, then check whether any have arrived - if so, we return
-- * before calling poll(). If not, we'll re-enable the signals
-- * in the ppoll() call.
-- */
--
-- sigemptyset(&origsigs);
-- if (m->handle_signals) {
-- /* Main pthread that handles the app signals */
-- if (frr_sigevent_check(&origsigs)) {
-- /* Signal to process - restore signal mask and return */
-- pthread_sigmask(SIG_SETMASK, &origsigs, NULL);
-- num = -1;
-- *eintr_p = true;
-- goto done;
-- }
-- } else {
-- /* Don't make any changes for the non-main pthreads */
-- pthread_sigmask(SIG_SETMASK, NULL, &origsigs);
-- }
-+ assert(count + 1 < pfdsize);
-+ pfds[count].fd = m->io_pipe[0];
-+ pfds[count].events = POLLIN;
-+ pfds[count].revents = 0x00;
-
--#if defined(HAVE_PPOLL)
-- struct timespec ts, *tsp;
-+ num = poll(pfds, count + 1, timeout);
-
-- if (timeout >= 0) {
-- ts.tv_sec = timeout / 1000;
-- ts.tv_nsec = (timeout % 1000) * 1000000;
-- tsp = &ts;
-- } else
-- tsp = NULL;
--
-- num = ppoll(m->handler.copy, count + 1, tsp, &origsigs);
-- pthread_sigmask(SIG_SETMASK, &origsigs, NULL);
--#else
-- /* Not ideal - there is a race after we restore the signal mask */
-- pthread_sigmask(SIG_SETMASK, &origsigs, NULL);
-- num = poll(m->handler.copy, count + 1, timeout);
--#endif
--
--done:
--
-- if (num < 0 && errno == EINTR)
-- *eintr_p = true;
--
-- if (num > 0 && m->handler.copy[count].revents != 0 && num--)
-+ unsigned char trash[64];
-+ if (num > 0 && pfds[count].revents != 0 && num--)
- while (read(m->io_pipe[0], &trash, sizeof(trash)) > 0)
- ;
-
-@@ -1766,7 +1719,7 @@ struct thread *thread_fetch(struct threa
- struct timeval zerotime = {0, 0};
- struct timeval tv;
- struct timeval *tw = NULL;
-- bool eintr_p = false;
-+
- int num = 0;
-
- do {
-@@ -1842,14 +1795,14 @@ struct thread *thread_fetch(struct threa
-
- pthread_mutex_unlock(&m->mtx);
- {
-- eintr_p = false;
-- num = fd_poll(m, tw, &eintr_p);
-+ num = fd_poll(m, m->handler.copy, m->handler.pfdsize,
-+ m->handler.copycount, tw);
- }
- pthread_mutex_lock(&m->mtx);
-
- /* Handle any errors received in poll() */
- if (num < 0) {
-- if (eintr_p) {
-+ if (errno == EINTR) {
- pthread_mutex_unlock(&m->mtx);
- /* loop around to signal handler */
- continue;