From 723b438523d97e6f7cc87d00f4c650f908dffa37 Mon Sep 17 00:00:00 2001 From: Nicolas Thill Date: Sun, 17 May 2009 00:26:50 +0000 Subject: [PATCH] remove quagga-unstable from upcoming 8.09 stable release(s) SVN-Revision: 15881 --- net/quagga-unstable/Makefile | 232 ------------ net/quagga-unstable/files/quagga | 333 ------------------ net/quagga-unstable/files/quagga.init | 11 - .../100-quagga_multipath_caching_policy.patch | 305 ---------------- 4 files changed, 881 deletions(-) delete mode 100644 net/quagga-unstable/Makefile delete mode 100644 net/quagga-unstable/files/quagga delete mode 100644 net/quagga-unstable/files/quagga.init delete mode 100644 net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch diff --git a/net/quagga-unstable/Makefile b/net/quagga-unstable/Makefile deleted file mode 100644 index f2a424a388..0000000000 --- a/net/quagga-unstable/Makefile +++ /dev/null @@ -1,232 +0,0 @@ -# -# Copyright (C) 2006 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -# $Id: Makefile 12175 2008-08-05 22:04:10Z florian $ - -include $(TOPDIR)/rules.mk - -PKG_NAME:=quagga-unstable -PKG_VERSION:=0.99.11 -PKG_RELEASE:=2 -PKG_MD5SUM:=903e40c744730ad4d62bee872eeb813b - -PKG_SOURCE_URL:=http://www.quagga.net/download/ \ - http://www.de.quagga.net/download/ \ - http://www.uk.quagga.net/download/ -PKG_SOURCE:=quagga-$(PKG_VERSION).tar.gz -PKG_BUILD_DIR:=$(BUILD_DIR)/quagga-$(PKG_VERSION) - -include $(INCLUDE_DIR)/package.mk - -define Package/quagga-unstable/Default - SECTION:=net - CATEGORY:=Network - DEPENDS:=quagga-unstable - TITLE:=The Quagga Software Routing Suite - URL:=http://www.quagga.net -endef - -define Package/quagga-unstable - $(call Package/quagga-unstable/Default) - DEPENDS:= - MENU:=1 -endef - -define Package/quagga-unstable/description - A routing software package that provides TCP/IP based routing services - with routing protocols support such as RIPv1, RIPv2, RIPng, OSPFv2, - OSPFv3, BGP-4, and BGP-4+ - -endef - -define Package/quagga-unstable-libzebra - $(call Package/quagga-unstable/Default) - TITLE:=zebra library -endef - -define Package/quagga-unstable-libospf - $(call Package/quagga-unstable/Default) - TITLE:=OSPF library -endef - -define Package/quagga-unstable-bgpd - $(call Package/quagga-unstable/Default) - DEPENDS += quagga-unstable-libzebra - TITLE:=BGPv4, BGPv4+, BGPv4- routing engine -endef - -define Package/quagga-unstable-isisd - $(call Package/quagga-unstable/Default) - TITLE:=IS-IS routing engine -endef - -define Package/quagga-unstable-ospfd - $(call Package/quagga-unstable/Default) - DEPENDS += quagga-unstable-libospf quagga-unstable-libzebra - TITLE:=OSPFv2 routing engine -endef - -define Package/quagga-unstable-ospf6d - $(call Package/quagga-unstable/Default) - DEPENDS += quagga-unstable-libospf quagga-unstable-libzebra - TITLE:=OSPFv3 routing engine -endef - -define Package/quagga-unstable-ripd - $(call Package/quagga-unstable/Default) - DEPENDS += quagga-unstable-libzebra - TITLE:=RIP routing engine -endef - -define Package/quagga-unstable-ripngd - $(call Package/quagga-unstable/Default) - DEPENDS += quagga-unstable-libzebra - TITLE:=RIPNG routing engine -endef - -define Package/quagga-unstable-vtysh - $(call Package/quagga-unstable/Default) - DEPENDS += quagga-unstable-libzebra +libreadline +libncurses - TITLE:=integrated shell for Quagga routing software -endef - -define Build/Configure - $(call Build/Configure/Default, \ - --localstatedir=/var/run/quagga \ - --sysconfdir=/etc/quagga/ \ - --enable-shared \ - --disable-static \ - --enable-ipv6 \ - --enable-vtysh \ - --enable-user=quagga \ - --enable-group=quagga \ - --enable-multipath=8 \ - --enable-isisd \ - ) -endef - -define Build/Compile - $(MAKE) -C $(PKG_BUILD_DIR) \ - DESTDIR=$(PKG_INSTALL_DIR) \ - all install -endef - -define Package/quagga-unstable/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/zebra $(1)/usr/sbin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/watchquagga $(1)/usr/sbin/ - # avoid /etc being set to 0750 - $(INSTALL_DIR) $(1)/etc/quagga/ - chmod 0750 $(1)/etc/quagga/ - $(INSTALL_DIR) $(1)/etc/init.d/ - $(INSTALL_BIN) ./files/quagga $(1)/usr/sbin/quagga.init - $(INSTALL_BIN) ./files/quagga.init $(1)/etc/init.d/quagga - $(INSTALL_DIR) $(1)/var/run/quagga -endef - -define Package/quagga-unstable/postinst -#!/bin/sh - -name=quagga -id=51 - -# do not change below -# check if we are on real system -if [ -z "$${IPKG_INSTROOT}" ]; then - # create copies of passwd and group, if we use squashfs - rootfs=`mount |awk '/root/ { print $$5 }'` - if [ "$$rootfs" = "squashfs" ]; then - if [ -h /etc/group ]; then - rm /etc/group - cp /rom/etc/group /etc/group - fi - if [ -h /etc/passwd ]; then - rm /etc/passwd - cp /rom/etc/passwd /etc/passwd - fi - fi -fi - -echo "" -if [ -z "$$(grep ^\\$${name}: $${IPKG_INSTROOT}/etc/group)" ]; then - echo "adding group $$name to /etc/group" - echo "$${name}:x:$${id}:" >> $${IPKG_INSTROOT}/etc/group -fi - -if [ -z "$$(grep ^\\$${name}: $${IPKG_INSTROOT}/etc/passwd)" ]; then - echo "adding user $$name to /etc/passwd" - echo "$${name}:x:$${id}:$${id}:$${name}:/tmp/.$${name}:/bin/false" >> $${IPKG_INSTROOT}/etc/passwd -fi - -grep -q '^zebra[[:space:]]*2601/tcp' $${IPKG_INSTROOT}/etc/services 2>/dev/null -if [ $$? -ne 0 ]; then -echo "zebrasrv 2600/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "zebra 2601/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "ripd 2602/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "ripngd 2603/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "ospfd 2604/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "bgpd 2605/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "ospf6d 2606/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "ospfapi 2607/tcp" >>$${IPKG_INSTROOT}/etc/services -echo "isisd 2608/tcp" >>$${IPKG_INSTROOT}/etc/services -fi -endef - -define Package/quagga-unstable-bgpd/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/bgpd $(1)/usr/sbin/ -endef - -define Package/quagga-unstable-isisd/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/isisd $(1)/usr/sbin -endef - -define Package/quagga-unstable-ospfd/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ospfd $(1)/usr/sbin/ -endef - -define Package/quagga-unstable-ospf6d/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ospf6d $(1)/usr/sbin/ -endef - -define Package/quagga-unstable-ripd/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ripd $(1)/usr/sbin/ -endef - -define Package/quagga-unstable-ripngd/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ripngd $(1)/usr/sbin/ -endef - -define Package/quagga-unstable-vtysh/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/vtysh $(1)/usr/bin/ -endef - -define Package/quagga-unstable-libospf/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libospf.so.* $(1)/usr/lib/ -endef - -define Package/quagga-unstable-libzebra/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzebra.so.* $(1)/usr/lib -endef - -$(eval $(call BuildPackage,quagga-unstable)) -$(eval $(call BuildPackage,quagga-unstable-libzebra)) -$(eval $(call BuildPackage,quagga-unstable-libospf)) -$(eval $(call BuildPackage,quagga-unstable-bgpd)) -$(eval $(call BuildPackage,quagga-unstable-isisd)) -$(eval $(call BuildPackage,quagga-unstable-ospfd)) -$(eval $(call BuildPackage,quagga-unstable-ospf6d)) -$(eval $(call BuildPackage,quagga-unstable-ripd)) -$(eval $(call BuildPackage,quagga-unstable-ripngd)) -$(eval $(call BuildPackage,quagga-unstable-vtysh)) diff --git a/net/quagga-unstable/files/quagga b/net/quagga-unstable/files/quagga deleted file mode 100644 index 01f8d7137d..0000000000 --- a/net/quagga-unstable/files/quagga +++ /dev/null @@ -1,333 +0,0 @@ -#!/bin/sh -# -# quagga Starts/stops quagga daemons and watchquagga. -# Create a daemon.conf file to have that routing daemon -# started/stopped automagically when using this script -# without any daemon names as args. -# If watchquagga is available, it will also be -# started/stopped if the script is called without -# any daemon names. -# - -ME=$(basename $0) - -usage() { - echo "Usage: ${ME} {start|stop|restart} [daemon ...]" - exit 2 -} - -if [ -z "$1" ] -then - usage -else - COMMAND=$1 -fi -shift -ARG_DAEMONS=$* -BINDIR=/usr/sbin -CONFDIR=/etc/quagga -STATEDIR=/var/run/quagga -DAEMONS="zebra ripd ripngd ospfd ospf6d bgpd" -DAEMON_FLAGS=-d -WATCHQUAGGA_FLAGS="-d -z -T 60 -R" -WATCHQUAGGA_CMD="$0 watchrestart" -if [ ${COMMAND} != "watchrestart" ] -then - DAEMONS="${DAEMONS} watchquagga" -fi -DAEMONS_STARTSEQ=${DAEMONS} - -reverse() -{ - local revlist r - revlist= - for r - do - revlist="$r $revlist" - done - echo $revlist -} - -DAEMONS_STOPSEQ=$(reverse ${DAEMONS_STARTSEQ}) - -#pidof() { -# ps ax | awk 'match($5, "(^|/)'"$1"'$") > 0 { printf " %s", $1 }' -#} - -quit() { - echo "${ME}: $1" - exit 0 -} - -die() { - echo "${ME}: $1" - exit 1 -} - -is_in() { - local i - for i in $2 - do - [ "$1" = "$i" ] && return 0 - done - return 1 -} - -select_subset() { - local unknown i j - unknown= - RESULT= - for i in $1 - do - is_in $i "$2" || unknown="$unknown $i" - done - if [ -n "$unknown" ] - then - RESULT=$unknown - return 1 - else - for j in $2 - do - is_in $j "$1" && RESULT="$RESULT $j" - done - return 0 - fi -} - -# check command - -case ${COMMAND} -in - start|stop|restart) - ;; - watchrestart) - if [ -n "$ARG_DAEMONS" ] - then - echo "${ME}: watchrestart mode is only for use by watchquagga" - exit 2 - fi - ;; - *) - usage - ;; -esac - -# select daemons to start - -case ${COMMAND} -in - start|restart|watchrestart) - START_DAEMONS= - for d in ${DAEMONS_STARTSEQ} - do - [ -x "${BINDIR}/${d}" -a -f "${CONFDIR}/${d}.conf" ] \ - && START_DAEMONS="${START_DAEMONS}${d} " - done - WATCHQUAGGA_DAEMONS=${START_DAEMONS} - if is_in watchquagga "${DAEMONS_STARTSEQ}" - then - START_DAEMONS="${START_DAEMONS} watchquagga" - fi - if [ -n "${ARG_DAEMONS}" ] - then - if select_subset "${ARG_DAEMONS}" "${DAEMONS}" - then - if select_subset "${ARG_DAEMONS}" "${START_DAEMONS}" - then - START_DAEMONS=${RESULT} - else - die "these daemons are not startable:${RESULT}." - fi - else - die "unknown daemons:${RESULT}; choose from: ${DAEMONS}." - fi - fi - ;; -esac - -# select daemons to stop - -case ${COMMAND} -in - stop|restart|watchrestart) - STOP_DAEMONS=${DAEMONS_STOPSEQ} - if [ -n "${ARG_DAEMONS}" ] - then - if select_subset "${ARG_DAEMONS}" "${STOP_DAEMONS}" - then - STOP_DAEMONS=${RESULT} - else - die "unknown daemons:${RESULT}; choose from: ${DAEMONS}." - fi - fi - stop_daemons= - for d in ${STOP_DAEMONS} - do - pidfile=${STATEDIR}/${d}.pid - if [ -f "${pidfile}" -o -n "$(pidof ${d})" ] - then - stop_daemons="${stop_daemons}${d} " - elif [ -n "${ARG_DAEMONS}" ] - then - echo "${ME}: found no ${d} process running." - fi - done - STOP_DAEMONS=${stop_daemons} - ;; -esac - -# stop daemons - -for d in $STOP_DAEMONS -do - echo -n "${ME}: Stopping ${d} ... " - pidfile=${STATEDIR}/${d}.pid - if [ -f "${pidfile}" ] - then - file_pid=$(cat ${pidfile}) - if [ -z "${file_pid}" ] - then - echo -n "no pid file entry found ... " - fi - else - file_pid= - echo -n "no pid file found ... " - fi - proc_pid=$(pidof ${d}) - if [ -z "${proc_pid}" ] - then - echo -n "found no ${d} process running ... " - else - count=0 - notinpidfile= - for p in ${proc_pid} - do - count=$((${count}+1)) - if kill ${p} - then - echo -n "killed ${p} ... " - else - echo -n "failed to kill ${p} ... " - fi - [ "${p}" = "${file_pid}" ] \ - || notinpidfile="${notinpidfile} ${p}" - done - [ ${count} -le 1 ] \ - || echo -n "WARNING: ${count} ${d} processes were found running ... " - for n in ${notinpidfile} - do - echo -n "WARNING: process ${n} was not in pid file ... " - done - fi - count=0 - survivors=$(pidof ${d}) - while [ -n "${survivors}" ] - do - sleep 1 - count=$((${count}+1)) - survivors=$(pidof ${d}) - [ -z "${survivors}" -o ${count} -gt 5 ] && break - for p in ${survivors} - do - sleep 1 - echo -n "${p} " - kill ${p} - done - done - survivors=$(pidof ${d}) - [ -n "${survivors}" ] && \ - if kill -KILL ${survivors} - then - echo -n "KILLed ${survivors} ... " - else - echo -n "failed to KILL ${survivors} ... " - fi - sleep 1 - survivors=$(pidof ${d}) - if [ -z "${survivors}" ] - then - echo -n "done." - if [ -f "${pidfile}" ] - then - rm -f ${pidfile} \ - || echo -n " Failed to remove pidfile." - fi - else - echo -n "failed to stop ${survivors} - giving up." - if [ "${survivors}" != "${file_pid}" ] - then - if echo "${survivors}" > ${pidfile} - then - chown quagga:quagga ${pidfile} - echo -n " Wrote ${survivors} to pidfile." - else - echo -n " Failed to write ${survivors} to pidfile." - fi - fi - fi - echo -done - -# start daemons - -if [ -n "$START_DAEMONS" ] -then - [ -d ${CONFDIR} ] \ - || quit "${ME}: no config directory ${CONFDIR} - exiting." - chown -R quagga:quagga ${CONFDIR} - [ -d ${STATEDIR} ] || mkdir -p ${STATEDIR} \ - || die "${ME}: could not create state directory ${STATEDIR} - exiting." - chown -R quagga:quagga ${STATEDIR} - - for d in $START_DAEMONS - do - echo -n "${ME}: Starting ${d} ... " - proc_pid=$(pidof ${d}) - pidfile=${STATEDIR}/${d}.pid - file_pid= - if [ -f "${pidfile}" ] - then - file_pid=$(cat ${pidfile}) - if [ -n "${file_pid}" ] - then - echo -n "found old pid file entry ${file_pid} ... " - fi - fi - if [ -n "${proc_pid}" ] - then - echo -n "found ${d} running (${proc_pid}) - skipping ${d}." - if [ "${proc_pid}" != "${file_pid}" ] - then - if echo "${proc_pid}" > ${pidfile} - then - chown quagga:quagga ${pidfile} - echo -n " Wrote ${proc_pid} to pidfile." - else - echo -n " Failed to write ${proc_pid} to pidfile." - fi - fi - elif rm -f "${pidfile}" - then - if [ "${d}" = "watchquagga" ] - then - $("${BINDIR}/${d}" \ - ${WATCHQUAGGA_FLAGS} \ - "${WATCHQUAGGA_CMD}" \ - ${WATCHQUAGGA_DAEMONS}) - status=$? - else - $("${BINDIR}/${d}" ${DAEMON_FLAGS}) - status=$? - fi - if [ $status -eq 0 ] - then - echo -n "done." - else - echo -n "failed." - fi - else - echo -n " failed to remove pidfile." - fi - echo - done -fi diff --git a/net/quagga-unstable/files/quagga.init b/net/quagga-unstable/files/quagga.init deleted file mode 100644 index 21fbf2c3ab..0000000000 --- a/net/quagga-unstable/files/quagga.init +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2006 OpenWrt.org - -START=60 -start() { - /usr/sbin/quagga.init start -} - -stop() { - /usr/sbin/quagga.init stop -} diff --git a/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch b/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch deleted file mode 100644 index 1213b040f3..0000000000 --- a/net/quagga-unstable/patches/100-quagga_multipath_caching_policy.patch +++ /dev/null @@ -1,305 +0,0 @@ -diff -urN quagga-0.99.11/configure.ac quagga-0.99.11.new/configure.ac ---- quagga-0.99.11/configure.ac 2008-10-02 10:31:09.000000000 +0200 -+++ quagga-0.99.11.new/configure.ac 2008-11-22 20:58:12.000000000 +0100 -@@ -385,7 +385,7 @@ - AC_CHECK_HEADERS([stropts.h sys/ksym.h sys/times.h sys/select.h \ - sys/types.h linux/version.h netdb.h asm/types.h \ - sys/param.h limits.h signal.h libutil.h \ -- sys/socket.h netinet/in.h]) -+ sys/socket.h netinet/in.h linux/ip_mp_alg.h]) - - dnl Utility macro to avoid retyping includes all the time - m4_define([QUAGGA_INCLUDES], -@@ -755,6 +755,17 @@ - AC_SUBST(KERNEL_METHOD) - AC_SUBST(OTHER_METHOD) - -+dnl ---------- -+dnl Check for RTA_MP_ALGO in linux/rtnetlink.h -+dnl ---------- -+AC_MSG_CHECKING(for support of multipath alg. in netlink) -+ if grep RTA_MP_ALGO linux/rtnetlink.h >/dev/null 2>&1; then -+ AC_DEFINE(HAVE_RT_MP_ALGO,,RTA_MP exist in rtnetlink) -+ AC_MSG_RESULT(yes) -+ else -+ AC_MSG_RESULT(no) -+ fi -+ - dnl -------------------------- - dnl Determine IS-IS I/O method - dnl -------------------------- -diff -urN quagga-0.99.11/lib/command.h quagga-0.99.11.new/lib/command.h ---- quagga-0.99.11/lib/command.h 2008-09-09 22:18:57.000000000 +0200 -+++ quagga-0.99.11.new/lib/command.h 2008-11-22 20:48:07.000000000 +0100 -@@ -101,6 +101,7 @@ - DUMP_NODE, /* Packet dump node. */ - FORWARDING_NODE, /* IP forwarding node. */ - PROTOCOL_NODE, /* protocol filtering node */ -+ MULTIPATH_NODE, /* Multipath policy node */ - VTY_NODE, /* Vty node. */ - }; - -@@ -272,6 +273,7 @@ - /* Common descriptions. */ - #define SHOW_STR "Show running system information\n" - #define IP_STR "IP information\n" -+#define MULTIPATH_STR "Configure multipath policy\n" - #define IPV6_STR "IPv6 information\n" - #define NO_STR "Negate a command or set its defaults\n" - #define REDIST_STR "Redistribute information from another routing protocol\n" -diff -urN quagga-0.99.11/lib/zebra.h quagga-0.99.11.new/lib/zebra.h ---- quagga-0.99.11/lib/zebra.h 2008-09-24 17:22:51.000000000 +0200 -+++ quagga-0.99.11.new/lib/zebra.h 2008-11-22 20:48:44.000000000 +0100 -@@ -168,6 +168,10 @@ - #define RT_TABLE_MAIN 0 - #endif /* HAVE_NETLINK */ - -+#ifdef HAVE_LINUX_IP_MP_ALG_H -+#include -+#endif /* HAVE_LINUX_IP_MP_ALG_H */ -+ - #ifdef HAVE_NETDB_H - #include - #endif /* HAVE_NETDB_H */ -diff -urN quagga-0.99.11/zebra/main.c quagga-0.99.11.new/zebra/main.c ---- quagga-0.99.11/zebra/main.c 2008-09-05 16:27:26.000000000 +0200 -+++ quagga-0.99.11.new/zebra/main.c 2008-11-22 20:48:44.000000000 +0100 -@@ -44,6 +44,7 @@ - struct zebra_t zebrad = - { - .rtm_table_default = 0, -+ .mpath = 0, - }; - - /* process id. */ -diff -urN quagga-0.99.11/zebra/multipath.h quagga-0.99.11.new/zebra/multipath.h ---- quagga-0.99.11/zebra/multipath.h 1970-01-01 01:00:00.000000000 +0100 -+++ quagga-0.99.11.new/zebra/multipath.h 2008-11-22 20:48:44.000000000 +0100 -@@ -0,0 +1,37 @@ -+/* -+ * multipath policy names. -+ * -+ * This file is part of Quagga routing suite. -+ * -+ * Quagga 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. -+ * -+ * Quagga is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GNU Zebra; see the file COPYING. If not, write to the Free -+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -+ * 02111-1307, USA. -+ */ -+ -+#ifndef ZEBRA_MULTIPATH_H -+#define ZEBRA_MULTIPATH_H -+#include -+ -+#ifdef HAVE_LINUX_IP_MP_ALG_H -+ -+static char *mp_alg_names[IP_MP_ALG_MAX+1] = { -+ [IP_MP_ALG_NONE] = "none", -+ [IP_MP_ALG_RR] = "rr", -+ [IP_MP_ALG_DRR] = "drr", -+ [IP_MP_ALG_RANDOM] = "random", -+ [IP_MP_ALG_WRANDOM] = "wrandom" -+ }; -+#endif -+#endif -+ -diff -urN quagga-0.99.11/zebra/rt_netlink.c quagga-0.99.11.new/zebra/rt_netlink.c ---- quagga-0.99.11/zebra/rt_netlink.c 2008-09-05 16:27:26.000000000 +0200 -+++ quagga-0.99.11.new/zebra/rt_netlink.c 2008-11-22 20:48:44.000000000 +0100 -@@ -36,6 +36,7 @@ - #include "thread.h" - #include "privs.h" - -+#include "multipath.h" - #include "zebra/zserv.h" - #include "zebra/rt.h" - #include "zebra/redistribute.h" -@@ -1694,6 +1695,16 @@ - if (src) - addattr_l (&req.n, sizeof req, RTA_PREFSRC, &src->ipv4, bytelen); - -+#ifdef HAVE_RT_MP_ALGO -+ if (zebrad.mpath != IP_MP_ALG_NONE) -+ { -+ if (IS_ZEBRA_DEBUG_KERNEL) -+ zlog_debug("netlink_route_multipath() (multihop): " -+ "multipath policy : %s",mp_alg_names[zebrad.mpath]); -+ -+ addattr_l (&req.n, 1024, RTA_MP_ALGO, &zebrad.mpath, sizeof(zebrad.mpath)); -+ } -+#endif - if (rta->rta_len > RTA_LENGTH (0)) - addattr_l (&req.n, 1024, RTA_MULTIPATH, RTA_DATA (rta), - RTA_PAYLOAD (rta)); -diff -urN quagga-0.99.11/zebra/zserv.c quagga-0.99.11.new/zebra/zserv.c ---- quagga-0.99.11/zebra/zserv.c 2008-09-24 17:22:51.000000000 +0200 -+++ quagga-0.99.11.new/zebra/zserv.c 2008-11-22 20:48:44.000000000 +0100 -@@ -36,6 +36,7 @@ - #include "privs.h" - #include "network.h" - #include "buffer.h" -+#include "multipath.h" - - #include "zebra/zserv.h" - #include "zebra/router-id.h" -@@ -1120,6 +1121,9 @@ - /* Set table number. */ - client->rtm_table = zebrad.rtm_table_default; - -+ /* Set multipath policy */ -+ client->mpath = zebrad.mpath; -+ - /* Add this client to linked list. */ - listnode_add (zebrad.client_list, client); - -@@ -1697,6 +1701,91 @@ - }; - - -+#ifdef HAVE_RT_MP_ALGO -+DEFUN (multipath_rr, -+ multipath_rr_cmd, -+ "multipath rr", -+ MULTIPATH_STR -+ "Round Robin multipath policy") -+{ -+ zebrad.mpath=IP_MP_ALG_RR; -+ return CMD_SUCCESS; -+} -+ -+DEFUN (multipath_drr, -+ multipath_drr_cmd, -+ "multipath drr", -+ MULTIPATH_STR -+ "Device round robin multipath policy") -+{ -+ zebrad.mpath=IP_MP_ALG_DRR; -+ return CMD_SUCCESS; -+} -+ -+DEFUN (multipath_random, -+ multipath_random_cmd, -+ "multipath random", -+ MULTIPATH_STR -+ "Random multipath policy") -+{ -+ zebrad.mpath=IP_MP_ALG_RANDOM; -+ return CMD_SUCCESS; -+} -+ -+DEFUN (multipath_wrandom, -+ multipath_wrandom_cmd, -+ "multipath wrandom", -+ MULTIPATH_STR -+ "Weighted random multipath policy") -+{ -+ zebrad.mpath=IP_MP_ALG_WRANDOM; -+ return CMD_SUCCESS; -+} -+ -+DEFUN (no_multipath, -+ no_multipath_cmd, -+ "no multipath", -+ NO_STR -+ MULTIPATH_STR -+ "Remove multipath policy") -+{ -+ zebrad.mpath=IP_MP_ALG_NONE; -+ return CMD_SUCCESS; -+} -+ -+DEFUN (show_multipath, -+ show_multipath_cmd, -+ "show multipath", -+ SHOW_STR -+ "Show multipath policy") -+{ -+ vty_out (vty, "multipath %s%s", mp_alg_names[zebrad.mpath], -+ VTY_NEWLINE); -+ return CMD_SUCCESS; -+} -+ -+/* multipath policy configuration write function. */ -+static int -+config_write_multipath (struct vty *vty) -+{ -+ -+ -+ if (zebrad.mpath) -+ vty_out (vty, "multipath %s%s", mp_alg_names[zebrad.mpath], -+ VTY_NEWLINE); -+ return 0; -+} -+ -+/* table node for multipath policy. */ -+struct cmd_node multipath_node = -+{ -+ MULTIPATH_NODE, -+ "", -+ 1 -+}; -+ -+#endif /* HAVE_RT_MP_ALGO */ -+ - /* Initialisation of zebra and installation of commands. */ - void - zebra_init (void) -@@ -1715,6 +1804,10 @@ - install_node (&table_node, config_write_table); - install_node (&forwarding_node, config_write_forwarding); - -+#ifdef HAVE_RT_MP_ALGO -+ install_node (&multipath_node, config_write_multipath); -+#endif -+ - install_element (VIEW_NODE, &show_ip_forwarding_cmd); - install_element (ENABLE_NODE, &show_ip_forwarding_cmd); - install_element (CONFIG_NODE, &ip_forwarding_cmd); -@@ -1725,6 +1818,14 @@ - install_element (VIEW_NODE, &show_table_cmd); - install_element (ENABLE_NODE, &show_table_cmd); - install_element (CONFIG_NODE, &config_table_cmd); -+#ifdef HAVE_RT_MP_ALGO -+ install_element (CONFIG_NODE, &multipath_rr_cmd); -+ install_element (CONFIG_NODE, &multipath_drr_cmd); -+ install_element (CONFIG_NODE, &multipath_random_cmd); -+ install_element (CONFIG_NODE, &multipath_wrandom_cmd); -+ install_element (CONFIG_NODE, &no_multipath_cmd); -+ install_element (ENABLE_NODE, &show_multipath_cmd); -+#endif /* HAVE_RT_MP_ALGO */ - #endif /* HAVE_NETLINK */ - - #ifdef HAVE_IPV6 -diff -urN quagga-0.99.11/zebra/zserv.h quagga-0.99.11.new/zebra/zserv.h ---- quagga-0.99.11/zebra/zserv.h 2008-09-24 17:22:51.000000000 +0200 -+++ quagga-0.99.11.new/zebra/zserv.h 2008-11-22 20:48:44.000000000 +0100 -@@ -55,6 +55,9 @@ - /* default routing table this client munges */ - int rtm_table; - -+ /* multipath policy */ -+ u_int32_t mpath; -+ - /* This client's redistribute flag. */ - u_char redist[ZEBRA_ROUTE_MAX]; - -@@ -78,6 +81,9 @@ - /* default table */ - int rtm_table_default; - -+ /* multipath policy */ -+ u_int32_t mpath; -+ - /* rib work queue */ - struct work_queue *ribq; - struct meta_queue *mq; -- 2.30.2