mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-02 12:22:47 +00:00
Merge remote-tracking branch 'origin/stable/2.0'
This commit is contained in:
commit
1a35e2e565
7
.gitignore
vendored
7
.gitignore
vendored
@ -64,3 +64,10 @@ cscope.*
|
||||
*.pb.h
|
||||
*.pb-c.h
|
||||
*.pb-c.c
|
||||
TAGS
|
||||
tags
|
||||
GTAGS
|
||||
GSYMS
|
||||
GRTAGS
|
||||
GPATH
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
ChangeLog information for Quagga is now recorded in our source-code
|
||||
ChangeLog information for FreeRangeRouting is for now recorded in source-code
|
||||
management system. Please see:
|
||||
|
||||
http://www.quagga.net/devel.php
|
||||
http://www.freerangerouting.org/
|
||||
|
@ -3,11 +3,11 @@
|
||||
SUBDIRS = lib qpb fpm @ZEBRA@ @LIBRFP@ @RFPTEST@ \
|
||||
@BGPD@ @RIPD@ @RIPNGD@ @OSPFD@ @OSPF6D@ @LDPD@ \
|
||||
@ISISD@ @PIMD@ @WATCHFRR@ @VTYSH@ @OSPFCLIENT@ @DOC@ m4 @pkgsrcdir@ \
|
||||
redhat @SOLARIS@ tests tools cumulus
|
||||
redhat @SOLARIS@ tests tools cumulus snapcraft
|
||||
|
||||
DIST_SUBDIRS = lib qpb fpm zebra bgpd ripd ripngd ospfd ospf6d ldpd \
|
||||
isisd watchfrr vtysh ospfclient doc m4 pkgsrc redhat tests \
|
||||
solaris pimd @LIBRFP@ @RFPTEST@ tools cumulus
|
||||
solaris pimd @LIBRFP@ @RFPTEST@ tools cumulus snapcraft
|
||||
|
||||
EXTRA_DIST = aclocal.m4 SERVICES REPORTING-BUGS \
|
||||
update-autotools \
|
||||
|
@ -1,5 +1,5 @@
|
||||
This file describes the procedure for reporting Quagga bugs. You are not
|
||||
obliged to follow this format, but it would be great help for Quagga developers
|
||||
This file describes the procedure for reporting FreeRangeRouting bugs. You are not
|
||||
obliged to follow this format, but it would be great help for FreeRangeRouting developers
|
||||
if you report a bug as described below.
|
||||
|
||||
Bugs submitted with woefully incomplete information may be summarily
|
||||
@ -9,23 +9,24 @@ additional information. Bugs may be closed after 30 days of
|
||||
non-response to requests to reconfirm or supply additional
|
||||
information.
|
||||
|
||||
Report bugs http://bugzilla.quagga.net
|
||||
Report bugs on Github Issue Tracker at
|
||||
https://github.com/freerangerouting/frr/issues
|
||||
|
||||
Please supply the following information:
|
||||
1. Your Quagga version or if it is from git then the commit reference.
|
||||
1. Your FreeRangeRouting version or if it is from git then the commit reference.
|
||||
Please try to report bugs against git master or the latest release.
|
||||
2. Quagga daemons you run e.g. bgpd or ripd and full name of your OS. Any
|
||||
2. FRR daemons you run e.g. bgpd or ripd and full name of your OS. Any
|
||||
specific options you compiled Quagga with.
|
||||
3. Problem description. Copy and paste relative commands and their output to
|
||||
describe your network setup e.g. "zebra>show ip route".
|
||||
Please, also give your simple network layout and output of relative OS
|
||||
commands (e.g., ifconfig (BSD) or ip (Linux)).
|
||||
4. All Quagga configuration files you use. If you don't want to publish your
|
||||
4. All FRR configuration files you use. If you don't want to publish your
|
||||
network numbers change 2 middle bytes in IPv4 address to be XXX (e.g.
|
||||
192.XXX.XXX.32/24). Similar could be done with IPv6.
|
||||
5. If any Quagga daemon core dumped, please, supply stack trace using the
|
||||
5. If any FRR daemon core dumped, please, supply stack trace using the
|
||||
following commands: host> gdb exec_file core_file , (gdb) bt .
|
||||
6. Run all Quagga daemons with full debugging on (see documentation on
|
||||
6. Run all FRR daemons with full debugging on (see documentation on
|
||||
debugging) and send _only_ part of logs which are relative to your problem.
|
||||
7. If the problem is difficult to reproduce please send a shell script to
|
||||
reproduce it.
|
||||
|
@ -171,6 +171,9 @@ bgp_bfd_deregister_peer (struct peer *peer)
|
||||
if (!CHECK_FLAG(bfd_info->flags, BFD_FLAG_BFD_REG))
|
||||
return;
|
||||
|
||||
bfd_info->status = BFD_STATUS_DOWN;
|
||||
bfd_info->last_update = bgp_clock();
|
||||
|
||||
bgp_bfd_peer_sendmsg(peer, ZEBRA_BFD_DEST_DEREGISTER);
|
||||
}
|
||||
|
||||
@ -311,14 +314,14 @@ bgp_bfd_dest_update (int command, struct zclient *zclient,
|
||||
prefix2str(&dp, buf[0], sizeof(buf[0]));
|
||||
if (ifp)
|
||||
{
|
||||
zlog_debug("Zebra: interface %s bfd destination %s %s",
|
||||
ifp->name, buf[0], bfd_get_status_str(status));
|
||||
zlog_debug("Zebra: vrf %d interface %s bfd destination %s %s",
|
||||
vrf_id, ifp->name, buf[0], bfd_get_status_str(status));
|
||||
}
|
||||
else
|
||||
{
|
||||
prefix2str(&sp, buf[1], sizeof(buf[1]));
|
||||
zlog_debug("Zebra: source %s bfd destination %s %s",
|
||||
buf[1], buf[0], bfd_get_status_str(status));
|
||||
zlog_debug("Zebra: vrf %d source %s bfd destination %s %s",
|
||||
vrf_id, buf[1], buf[0], bfd_get_status_str(status));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,7 +91,7 @@ struct bgp_dump
|
||||
struct thread *t_interval;
|
||||
};
|
||||
|
||||
static int bgp_dump_unset (struct vty *vty, struct bgp_dump *bgp_dump);
|
||||
static int bgp_dump_unset (struct bgp_dump *bgp_dump);
|
||||
static int bgp_dump_interval_func (struct thread *);
|
||||
|
||||
/* BGP packet dump output buffer. */
|
||||
@ -657,7 +657,7 @@ bgp_dump_set (struct vty *vty, struct bgp_dump *bgp_dump,
|
||||
}
|
||||
|
||||
/* Removing previous config */
|
||||
bgp_dump_unset(vty, bgp_dump);
|
||||
bgp_dump_unset(bgp_dump);
|
||||
|
||||
if (interval_str)
|
||||
{
|
||||
@ -696,7 +696,7 @@ bgp_dump_set (struct vty *vty, struct bgp_dump *bgp_dump,
|
||||
}
|
||||
|
||||
static int
|
||||
bgp_dump_unset (struct vty *vty, struct bgp_dump *bgp_dump)
|
||||
bgp_dump_unset (struct bgp_dump *bgp_dump)
|
||||
{
|
||||
/* Removing file name. */
|
||||
if (bgp_dump->filename)
|
||||
@ -817,7 +817,7 @@ DEFUN (no_dump_bgp_all,
|
||||
break;
|
||||
}
|
||||
|
||||
return bgp_dump_unset (vty, bgp_dump_struct);
|
||||
return bgp_dump_unset (bgp_dump_struct);
|
||||
}
|
||||
|
||||
/* BGP node structure. */
|
||||
@ -919,6 +919,10 @@ bgp_dump_init (void)
|
||||
void
|
||||
bgp_dump_finish (void)
|
||||
{
|
||||
bgp_dump_unset (&bgp_dump_all);
|
||||
bgp_dump_unset (&bgp_dump_updates);
|
||||
bgp_dump_unset (&bgp_dump_routes);
|
||||
|
||||
stream_free (bgp_dump_obuf);
|
||||
bgp_dump_obuf = NULL;
|
||||
}
|
||||
|
@ -40,6 +40,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "queue.h"
|
||||
#include "vrf.h"
|
||||
#include "bfd.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "bgpd/bgpd.h"
|
||||
#include "bgpd/bgp_attr.h"
|
||||
@ -60,6 +61,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
#endif
|
||||
|
||||
/* bgpd options, we use GNU getopt library. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
static const struct option longopts[] =
|
||||
{
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
@ -70,6 +72,7 @@ static const struct option longopts[] =
|
||||
{ "listenon", required_argument, NULL, 'l'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK },
|
||||
{ "retain", no_argument, NULL, 'r'},
|
||||
{ "no_kernel", no_argument, NULL, 'n'},
|
||||
{ "user", required_argument, NULL, 'u'},
|
||||
@ -112,6 +115,9 @@ static struct quagga_signal_t bgp_signals[] =
|
||||
/* Configuration file and directory. */
|
||||
char config_default[] = SYSCONFDIR BGP_DEFAULT_CONFIG;
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = BGP_VTYSH_PATH;
|
||||
|
||||
/* Route retain mode flag. */
|
||||
static int retain_mode = 0;
|
||||
|
||||
@ -124,6 +130,7 @@ static const char *pid_file = PATH_BGPD_PID;
|
||||
/* VTY port number and address. */
|
||||
int vty_port = BGP_VTY_PORT;
|
||||
char *vty_addr = NULL;
|
||||
char *vty_sock_name;
|
||||
|
||||
/* privileges */
|
||||
static zebra_capabilities_t _caps_p [] =
|
||||
@ -166,6 +173,7 @@ redistribution between different routing protocols.\n\n\
|
||||
-l, --listenon Listen on specified address (implies -n)\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-r, --retain When program terminates, retain added route by bgpd.\n\
|
||||
-n, --no_kernel Do not install route to kernel.\n\
|
||||
-u, --user User to run as\n\
|
||||
@ -196,7 +204,7 @@ sighup (void)
|
||||
vty_read_config (config_file, config_default);
|
||||
|
||||
/* Create VTY's socket */
|
||||
vty_serv_sock (vty_addr, vty_port, BGP_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Try to return to normal operation. */
|
||||
}
|
||||
@ -303,6 +311,8 @@ bgp_exit (int status)
|
||||
if (zlog_default)
|
||||
closezlog (zlog_default);
|
||||
|
||||
memset (bm, 0, sizeof (*bm));
|
||||
|
||||
if (bgp_debug_count())
|
||||
log_memstats_stderr ("bgpd");
|
||||
exit (status);
|
||||
@ -470,6 +480,9 @@ main (int argc, char **argv)
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = BGP_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, BGP_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'r':
|
||||
retain_mode = 1;
|
||||
break;
|
||||
@ -545,7 +558,7 @@ main (int argc, char **argv)
|
||||
pid_output (pid_file);
|
||||
|
||||
/* Make bgp vty socket. */
|
||||
vty_serv_sock (vty_addr, vty_port, BGP_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Print banner. */
|
||||
zlog_notice ("BGPd %s starting: vty@%d, bgp@%s:%d", FRR_COPYRIGHT,
|
||||
|
@ -4271,6 +4271,7 @@ peer_update_source_vty (struct vty *vty, const char *peer_str,
|
||||
const char *source_str)
|
||||
{
|
||||
struct peer *peer;
|
||||
struct prefix p;
|
||||
|
||||
peer = peer_and_group_lookup_vty (vty, peer_str);
|
||||
if (! peer)
|
||||
@ -4287,7 +4288,16 @@ peer_update_source_vty (struct vty *vty, const char *peer_str,
|
||||
if (ret == 0)
|
||||
peer_update_source_addr_set (peer, &su);
|
||||
else
|
||||
peer_update_source_if_set (peer, source_str);
|
||||
{
|
||||
if (str2prefix (source_str, &p))
|
||||
{
|
||||
vty_out (vty, "%% Invalid update-source, remove prefix length %s",
|
||||
VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
else
|
||||
peer_update_source_if_set (peer, source_str);
|
||||
}
|
||||
}
|
||||
else
|
||||
peer_update_source_unset (peer);
|
||||
@ -8217,11 +8227,19 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js
|
||||
tm = gmtime(&uptime);
|
||||
json_object_int_add(json_neigh, "lastResetTimerMsecs", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
|
||||
json_object_string_add(json_neigh, "lastResetDueTo", peer_down_str[(int) p->last_reset]);
|
||||
if (p->last_reset_cause_size)
|
||||
if (p->last_reset == PEER_DOWN_NOTIFY_SEND ||
|
||||
p->last_reset == PEER_DOWN_NOTIFY_RECEIVED)
|
||||
{
|
||||
char errorcodesubcode_hexstr[5];
|
||||
char errorcodesubcode_str[256];
|
||||
|
||||
code_str = bgp_notify_code_str(p->notify.code);
|
||||
subcode_str = bgp_notify_subcode_str(p->notify.code, p->notify.subcode);
|
||||
|
||||
sprintf(errorcodesubcode_hexstr, "%02X%02X", p->notify.code, p->notify.subcode);
|
||||
json_object_string_add(json_neigh, "lastErrorCodeSubcode", errorcodesubcode_hexstr);
|
||||
snprintf(errorcodesubcode_str, 255, "%s%s", code_str, subcode_str);
|
||||
json_object_string_add(json_neigh, "lastNotificationReason", errorcodesubcode_str);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
17
bgpd/bgpd.c
17
bgpd/bgpd.c
@ -6723,26 +6723,27 @@ bgp_config_write_peer_global (struct vty *vty, struct bgp *bgp,
|
||||
}
|
||||
|
||||
/* advertisement-interval */
|
||||
if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV)
|
||||
&& peer->v_routeadv != BGP_DEFAULT_EBGP_ROUTEADV
|
||||
&& ! peer_group_active (peer))
|
||||
if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV) &&
|
||||
((! peer_group_active (peer) && peer->v_routeadv != BGP_DEFAULT_EBGP_ROUTEADV) ||
|
||||
(peer_group_active (peer) && peer->v_routeadv != g_peer->v_routeadv)))
|
||||
{
|
||||
vty_out (vty, " neighbor %s advertisement-interval %d%s",
|
||||
addr, peer->v_routeadv, VTY_NEWLINE);
|
||||
}
|
||||
|
||||
/* timers */
|
||||
if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)
|
||||
&& (peer->keepalive != BGP_DEFAULT_KEEPALIVE || peer->holdtime != BGP_DEFAULT_HOLDTIME)
|
||||
&& ! peer_group_active (peer))
|
||||
if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER) &&
|
||||
((! peer_group_active (peer) && (peer->keepalive != BGP_DEFAULT_KEEPALIVE || peer->holdtime != BGP_DEFAULT_HOLDTIME)) ||
|
||||
(peer_group_active (peer) && (peer->keepalive != g_peer->keepalive || peer->holdtime != g_peer->holdtime))))
|
||||
{
|
||||
vty_out (vty, " neighbor %s timers %d %d%s", addr,
|
||||
peer->keepalive, peer->holdtime, VTY_NEWLINE);
|
||||
}
|
||||
|
||||
if (CHECK_FLAG (peer->config, PEER_CONFIG_CONNECT) &&
|
||||
peer->connect != BGP_DEFAULT_CONNECT_RETRY &&
|
||||
! peer_group_active (peer))
|
||||
((! peer_group_active (peer) && peer->connect != BGP_DEFAULT_CONNECT_RETRY) ||
|
||||
(peer_group_active (peer) && peer->connect != g_peer->connect)))
|
||||
|
||||
{
|
||||
vty_out (vty, " neighbor %s timers connect %d%s", addr,
|
||||
peer->connect, VTY_NEWLINE);
|
||||
|
@ -4,7 +4,7 @@
|
||||
# builds some git commit of Quagga in some different configurations
|
||||
# usage: buildtest.sh [commit [configurations...]]
|
||||
|
||||
basecfg="--prefix=/usr --enable-user=quagga --enable-group=quagga --enable-vty-group=quagga --enable-configfile-mask=0660 --enable-logfile-mask=0640 --enable-vtysh --sysconfdir=/etc/quagga --enable-exampledir=/etc/quagga/samples --localstatedir=/var/run/quagga --libdir=/usr/lib64/quagga --enable-rtadv --disable-static --enable-isisd --enable-multipath=0 --enable-pimd --enable-werror"
|
||||
basecfg="--prefix=/usr --enable-user=frr --enable-group=frr --enable-vty-group=frr --enable-configfile-mask=0660 --enable-logfile-mask=0640 --enable-vtysh --sysconfdir=/etc/frr --enable-exampledir=/etc/frr/samples --localstatedir=/var/run/frr --libdir=/usr/lib64/frr --enable-rtadv --disable-static --enable-isisd --enable-multipath=0 --enable-pimd --enable-werror"
|
||||
|
||||
configs_base="gcc|$basecfg"
|
||||
|
||||
@ -36,7 +36,7 @@ trap errfunc ERR
|
||||
|
||||
COMMITREF="$1"
|
||||
COMMITISH="`git rev-list --max-count=1 ${COMMITREF:-HEAD}`"
|
||||
TEMP="`mktemp -t -d quaggabuild.XXXXXX`"
|
||||
TEMP="`mktemp -t -d frrbuild.XXXXXX`"
|
||||
BASE="`pwd`"
|
||||
CONFIGS="$2"
|
||||
|
||||
|
@ -30,9 +30,9 @@ Q_PROTOBUF_SRCS = $(Q_PROTOBUF_CFILES) $(Q_PROTOBUF_HFILES)
|
||||
#
|
||||
# Information about how to link to various libraries.
|
||||
#
|
||||
Q_QUAGGA_PB_CLIENT_LDOPTS = $(top_srcdir)/qpb/libquagga_pb.la $(Q_PROTOBUF_C_CLIENT_LDOPTS)
|
||||
Q_FRR_PB_CLIENT_LDOPTS = $(top_srcdir)/qpb/libfrr_pb.la $(Q_PROTOBUF_C_CLIENT_LDOPTS)
|
||||
|
||||
Q_FPM_PB_CLIENT_LDOPTS = $(top_srcdir)/fpm/libfpm_pb.la $(Q_QUAGGA_PB_CLIENT_LDOPTS)
|
||||
Q_FPM_PB_CLIENT_LDOPTS = $(top_srcdir)/fpm/libfpm_pb.la $(Q_FRR_PB_CLIENT_LDOPTS)
|
||||
|
||||
endif # HAVE_PROTOBUF
|
||||
|
||||
|
@ -493,6 +493,7 @@ dnl -----------------------------------
|
||||
if test "x${EXTRAVERSION}" != "x" ; then
|
||||
VERSION="${VERSION}${EXTRAVERSION}"
|
||||
PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
|
||||
AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
|
||||
PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
|
||||
fi
|
||||
|
||||
@ -1694,6 +1695,8 @@ AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
|
||||
pkgsrc/Makefile
|
||||
fpm/Makefile
|
||||
redhat/frr.spec
|
||||
snapcraft/Makefile
|
||||
snapcraft/snapcraft.yaml
|
||||
lib/version.h
|
||||
doc/defines.texi
|
||||
doc/bgpd.8
|
||||
|
39
debian/README.Debian
vendored
39
debian/README.Debian
vendored
@ -14,39 +14,26 @@ available forcing you to explicitly type "apt-get install frr" to upgrade it.
|
||||
* What is frr?
|
||||
=================
|
||||
|
||||
http://www.freerangerouting.net/
|
||||
> Frr is a routing software suite, providing implementations of OSPFv2,
|
||||
> OSPFv3, RIP v1 and v2, RIPv3 and BGPv4 for Unix platforms, particularly
|
||||
> FreeBSD and Linux and also NetBSD, to mention a few. Frr is a fork of GNU
|
||||
> Zebra which was developed by Kunihiro Ishiguro. Development of GNU Zebra
|
||||
> slowed dramatically to the point where eventually GNU Zebra was forked into
|
||||
> Frr.
|
||||
|
||||
> The Frr tree is an attempt to provide a zebra tree with at least the
|
||||
> bug-fixes, which have accumulated, applied, while tracking any significant
|
||||
> changes made to the zebra.org tree. Ultimately, this tree hopes to revitalise
|
||||
> development of this code base.
|
||||
|
||||
I packaged zebra-pj which was then renamed to frr to get people used to it
|
||||
and offer Debian users the choice which versions they like to use. I hope this
|
||||
brings frr some feedback and helps it evolving to a good successor of the
|
||||
orphaned zebra.
|
||||
|
||||
-- Christian Hammers <ch@debian.org>, Jul/Aug 2003
|
||||
http://www.freerangerouting.org/
|
||||
FRR is a routing software suite, providing implementations of OSPFv2,
|
||||
OSPFv3, RIP v1 and v2, RIPng, ISIS, PIM, BGP and LDP for Unix platforms, particularly
|
||||
FreeBSD and Linux and also NetBSD, to mention a few. FRR is a fork of Quagga
|
||||
which itself is a fork of Zebra.
|
||||
Zebra was developed by Kunihiro Ishiguro.
|
||||
|
||||
|
||||
* Why has SNMP support been disabled?
|
||||
=====================================
|
||||
Frr used to link against the NetSNMP libraries to provide SNMP
|
||||
FRR used to link against the NetSNMP libraries to provide SNMP
|
||||
support. Those libraries sadly link against the OpenSSL libraries
|
||||
to provide crypto support for SNMPv3 among others.
|
||||
OpenSSL now is not compatible with the GNU GENERAL PUBLIC LICENSE (GPL)
|
||||
licence that Frr is distributed under. For more explanation read:
|
||||
licence that FRR is distributed under. For more explanation read:
|
||||
http://www.gnome.org/~markmc/openssl-and-the-gpl.html
|
||||
http://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs
|
||||
Updating the licence to explecitly allow linking against OpenSSL
|
||||
would requite the affirmation of all people that ever contributed
|
||||
a significant part to Zebra or Frr and thus are the collective
|
||||
a significant part to Zebra / Quagga or FRR and thus are the collective
|
||||
"copyright holder". That's too much work. Using a shrinked down
|
||||
version of NetSNMP without OpenSSL or convincing the NetSNMP people
|
||||
to change to GnuTLS are maybe good solutions but not reachable
|
||||
@ -55,7 +42,7 @@ during the last days before the Sarge release :-(
|
||||
*BUT*
|
||||
|
||||
It is allowed by the used licence mix that you fetch the sources and
|
||||
build Frr yourself with SNMP with
|
||||
build FRR yourself with SNMP with
|
||||
<remove the "grep ^smux" block at the end of debian/frr.preinst>
|
||||
# export WANT_SNMP=1
|
||||
# apt-get -b source frr
|
||||
@ -73,9 +60,9 @@ Default is not to start anything, since it can hose your
|
||||
system's routing table if not set up properly.
|
||||
|
||||
Priorities were suggested by Dancer <dancer@zeor.simegen.com>.
|
||||
They're used to start the Frr daemons in more than one step
|
||||
They're used to start the FRR daemons in more than one step
|
||||
(for example start one or two at network initialization and the
|
||||
rest later). The number of Frr daemons being small, priorities
|
||||
rest later). The number of FRR daemons being small, priorities
|
||||
must be between 1 and 9, inclusive (or the initscript has to be
|
||||
changed). /etc/init.d/frr then can be started as
|
||||
|
||||
@ -99,7 +86,7 @@ If this message occurs the receive buffer should be increased by adding the
|
||||
following to /etc/sysctl.conf and "--nl-bufsize" to /etc/frr/debian.conf.
|
||||
> net.core.rmem_default = 262144
|
||||
> net.core.rmem_max = 262144
|
||||
See message #4525 from 2005-05-09 in the frr-users mailing list.
|
||||
See message #4525 from 2005-05-09 in the quagga-users mailing list.
|
||||
|
||||
|
||||
* vtysh immediately exists:
|
||||
|
2
debian/changelog
vendored
2
debian/changelog
vendored
@ -2,6 +2,8 @@ frr (2.1) Released; urgency=medium
|
||||
|
||||
* Switchover to FRR
|
||||
|
||||
-- frr <frr@lists.nox.tf> Mon, 23 Jan 2017 16:30:22 -0400
|
||||
|
||||
quagga (0.99.24+cl3u5) RELEASED; urgency=medium
|
||||
|
||||
* Closes: CM-12846 - Resolve Memory leaks in 'show ip bgp neighbor json'
|
||||
|
4
debian/copyright
vendored
4
debian/copyright
vendored
@ -1,7 +1,7 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: Frr
|
||||
Upstream-Contact: maintainers@freerangerouting.net, security@freerangerouting.net
|
||||
Source: http://www.freerangerouting.net/
|
||||
Upstream-Contact: maintainers@freerangerouting.org, security@freerangerouting.org
|
||||
Source: http://www.freerangerouting.org/
|
||||
|
||||
Files: *
|
||||
Copyright: 1996-2003 by the original Zebra authors:
|
||||
|
12
doc/frr.texi
12
doc/frr.texi
@ -7,7 +7,7 @@
|
||||
@setfilename frr.info
|
||||
@c Set variables - sourced from defines.texi
|
||||
@include defines.texi
|
||||
@settitle @uref{http://www.freerangerouting.net,,@value{PACKAGE_NAME}}
|
||||
@settitle @uref{http://www.freerangerouting.org,,@value{PACKAGE_NAME}}
|
||||
@c %**end of header
|
||||
|
||||
@c automake will automatically generate version.texi
|
||||
@ -48,16 +48,16 @@ This file documents the Frr Software Routing Suite which manages common
|
||||
TCP/IP routing protocols.
|
||||
|
||||
This is Edition @value{EDITION}, last updated @value{UPDATED} of
|
||||
@cite{The Frr Manual}, for @uref{http://www.freerangerouting.net/,,@value{PACKAGE_NAME}}
|
||||
@cite{The Frr Manual}, for @uref{http://www.freerangerouting.org/,,@value{PACKAGE_NAME}}
|
||||
Version @value{VERSION}.
|
||||
|
||||
@insertcopying
|
||||
@end ifinfo
|
||||
|
||||
@titlepage
|
||||
@title @uref{http://www.freerangerouting.net,,Frr}
|
||||
@title @uref{http://www.freerangerouting.org,,Frr}
|
||||
@subtitle A routing software package for TCP/IP networks
|
||||
@subtitle @uref{http://www.freerangerouting.net,,@value{PACKAGE_NAME}} @value{VERSION}
|
||||
@subtitle @uref{http://www.freerangerouting.org,,@value{PACKAGE_NAME}} @value{VERSION}
|
||||
@subtitle @value{UPDATED-MONTH}
|
||||
@author @value{AUTHORS}
|
||||
|
||||
@ -72,9 +72,9 @@ Version @value{VERSION}.
|
||||
@node Top
|
||||
@top Frr -- With Virtual Network Control
|
||||
|
||||
@uref{http://www.freerangerouting.net,,Frr} is an advanced routing software package
|
||||
@uref{http://www.freerangerouting.org,,Frr} is an advanced routing software package
|
||||
that provides a suite of TCP/IP based routing protocols. This is the Manual
|
||||
for @value{PACKAGE_STRING}. @uref{http://www.freerangerouting.net,,Frr} is a fork of
|
||||
for @value{PACKAGE_STRING}. @uref{http://www.freerangerouting.org,,Frr} is a fork of
|
||||
@uref{http://www.quagga.net,,Quagga}.
|
||||
|
||||
@insertcopying
|
||||
|
@ -2,7 +2,7 @@
|
||||
@chapter Overview
|
||||
@cindex Overview
|
||||
|
||||
@uref{http://www.freerangerouting.net,,Frr} is a routing software package that
|
||||
@uref{http://www.freerangerouting.org,,Frr} is a routing software package that
|
||||
provides TCP/IP based routing services with routing protocols support such
|
||||
as RIPv1, RIPv2, RIPng, OSPFv2, OSPFv3, IS-IS, BGP-4, and BGP-4+ (@pxref{Supported
|
||||
RFCs}). Frr also supports special BGP Route Reflector and Route Server
|
||||
@ -275,12 +275,12 @@ November 1995.}
|
||||
|
||||
The official Frr web-site is located at:
|
||||
|
||||
@uref{http://www.freerangerouting.net/}
|
||||
@uref{http://www.freerangerouting.org/}
|
||||
|
||||
and contains further information, as well as links to additional
|
||||
resources.
|
||||
|
||||
@uref{http://www.freerangerouting.net/,Frr} is a fork of Quagga, whose
|
||||
@uref{http://www.freerangerouting.org/,Frr} is a fork of Quagga, whose
|
||||
web-site is located at:
|
||||
|
||||
@uref{http://www.quagga.net/}.
|
||||
@ -298,7 +298,7 @@ comments or suggestions to Frr, please subscribe to:
|
||||
|
||||
@uref{http://lists.nox.tf/listinfo/frr-users}.
|
||||
|
||||
The @uref{http://www.freerangerouting.net/,,Frr} site has further information on
|
||||
The @uref{http://www.freerangerouting.org/,,Frr} site has further information on
|
||||
the available mailing lists, see:
|
||||
|
||||
@uref{http://lists.nox.tf/lists.php}
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "plist.h"
|
||||
#include "zclient.h"
|
||||
#include "vrf.h"
|
||||
#include "sockopt.h"
|
||||
#include "qobj.h"
|
||||
|
||||
#include "isisd/dict.h"
|
||||
@ -81,6 +82,7 @@ struct zebra_privs_t isisd_privs = {
|
||||
};
|
||||
|
||||
/* isisd options */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
struct option longopts[] = {
|
||||
{"daemon", no_argument, NULL, 'd'},
|
||||
{"config_file", required_argument, NULL, 'f'},
|
||||
@ -88,6 +90,7 @@ struct option longopts[] = {
|
||||
{"socket", required_argument, NULL, 'z'},
|
||||
{"vty_addr", required_argument, NULL, 'A'},
|
||||
{"vty_port", required_argument, NULL, 'P'},
|
||||
{"vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{"user", required_argument, NULL, 'u'},
|
||||
{"group", required_argument, NULL, 'g'},
|
||||
{"version", no_argument, NULL, 'v'},
|
||||
@ -103,6 +106,9 @@ char *config_file = NULL;
|
||||
/* isisd program name. */
|
||||
char *progname;
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = ISIS_VTYSH_PATH;
|
||||
|
||||
int daemon_mode = 0;
|
||||
|
||||
/* Master of threads. */
|
||||
@ -144,6 +150,7 @@ Daemon which manages IS-IS routing\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-u, --user User to run as\n\
|
||||
-g, --group Group to run as\n\
|
||||
-v, --version Print program version\n\
|
||||
@ -305,6 +312,9 @@ main (int argc, char **argv, char **envp)
|
||||
vty_port = atoi (optarg);
|
||||
vty_port = (vty_port ? vty_port : ISISD_VTY_PORT);
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, ISIS_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'u':
|
||||
isisd_privs.user = optarg;
|
||||
break;
|
||||
@ -379,7 +389,7 @@ main (int argc, char **argv, char **envp)
|
||||
pid_output (pid_file);
|
||||
|
||||
/* Make isis vty socket. */
|
||||
vty_serv_sock (vty_addr, vty_port, ISIS_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Print banner. */
|
||||
zlog_notice ("Quagga-ISISd %s starting: vty@%d", FRR_VERSION, vty_port);
|
||||
|
@ -610,12 +610,32 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected,
|
||||
if (!tlvs->te_ipv4_reachs)
|
||||
tlvs->te_ipv4_reachs = list_new ();
|
||||
listnode_add (tlvs->te_ipv4_reachs, te_ipv4_reach);
|
||||
/* this trickery is permitable since no subtlvs are defined */
|
||||
value_len += 5 + ((te_ipv4_reach->control & 0x3F) ?
|
||||
((((te_ipv4_reach->control & 0x3F) -
|
||||
1) >> 3) + 1) : 0);
|
||||
pnt += 5 + ((te_ipv4_reach->control & 0x3F) ?
|
||||
((((te_ipv4_reach->control & 0x3F) - 1) >> 3) + 1) : 0);
|
||||
|
||||
/* Metric + Control-Byte + Prefix */
|
||||
unsigned int entry_len = 5 + PSIZE(te_ipv4_reach->control & 0x3F);
|
||||
value_len += entry_len;
|
||||
pnt += entry_len;
|
||||
|
||||
if (te_ipv4_reach->control & TE_IPV4_HAS_SUBTLV)
|
||||
{
|
||||
if (length <= value_len)
|
||||
{
|
||||
zlog_warn("ISIS-TLV (%s): invalid IPv4 extended reachability SubTLV missing",
|
||||
areatag);
|
||||
retval = ISIS_WARNING;
|
||||
break;
|
||||
}
|
||||
u_char subtlv_len = *pnt;
|
||||
value_len += subtlv_len + 1;
|
||||
pnt += subtlv_len + 1;
|
||||
if (length < value_len)
|
||||
{
|
||||
zlog_warn("ISIS-TLV (%s): invalid IPv4 extended reachability SubTLVs have oversize",
|
||||
areatag);
|
||||
retval = ISIS_WARNING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -682,6 +702,27 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected,
|
||||
prefix_octets = ((ipv6_reach->prefix_len + 7) / 8);
|
||||
value_len += prefix_octets + 6;
|
||||
pnt += prefix_octets + 6;
|
||||
|
||||
if (ipv6_reach->control_info & CTRL_INFO_SUBTLVS)
|
||||
{
|
||||
if (length <= value_len)
|
||||
{
|
||||
zlog_warn("ISIS-TLV (%s): invalid IPv6 extended reachability SubTLV missing",
|
||||
areatag);
|
||||
retval = ISIS_WARNING;
|
||||
break;
|
||||
}
|
||||
u_char subtlv_len = *pnt;
|
||||
value_len += subtlv_len + 1;
|
||||
pnt += subtlv_len + 1;
|
||||
if (length < value_len)
|
||||
{
|
||||
zlog_warn("ISIS-TLV (%s): invalid IPv6 extended reachability SubTLVs have oversize",
|
||||
areatag);
|
||||
retval = ISIS_WARNING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* FIXME: sub-tlvs */
|
||||
if (!tlvs->ipv6_reachs)
|
||||
tlvs->ipv6_reachs = list_new ();
|
||||
@ -752,6 +793,9 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected,
|
||||
pnt += length;
|
||||
break;
|
||||
}
|
||||
/* Abort Parsing if error occured */
|
||||
if (retval != ISIS_OK)
|
||||
return retval;
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
@ -223,7 +223,7 @@ struct te_ipv4_reachability
|
||||
u_char prefix_start; /* since this is variable length by nature it only */
|
||||
}; /* points to an approximate location */
|
||||
|
||||
|
||||
#define TE_IPV4_HAS_SUBTLV (0x40)
|
||||
|
||||
struct idrp_info
|
||||
{
|
||||
|
@ -51,28 +51,28 @@ control_init(void)
|
||||
|
||||
memset(&s_un, 0, sizeof(s_un));
|
||||
s_un.sun_family = AF_UNIX;
|
||||
strlcpy(s_un.sun_path, LDPD_SOCKET, sizeof(s_un.sun_path));
|
||||
strlcpy(s_un.sun_path, ctl_sock_path, sizeof(s_un.sun_path));
|
||||
|
||||
if (unlink(LDPD_SOCKET) == -1)
|
||||
if (unlink(ctl_sock_path) == -1)
|
||||
if (errno != ENOENT) {
|
||||
log_warn("%s: unlink %s", __func__, LDPD_SOCKET);
|
||||
log_warn("%s: unlink %s", __func__, ctl_sock_path);
|
||||
close(fd);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
old_umask = umask(S_IXUSR|S_IXGRP|S_IWOTH|S_IROTH|S_IXOTH);
|
||||
if (bind(fd, (struct sockaddr *)&s_un, sizeof(s_un)) == -1) {
|
||||
log_warn("%s: bind: %s", __func__, LDPD_SOCKET);
|
||||
log_warn("%s: bind: %s", __func__, ctl_sock_path);
|
||||
close(fd);
|
||||
umask(old_umask);
|
||||
return (-1);
|
||||
}
|
||||
umask(old_umask);
|
||||
|
||||
if (chmod(LDPD_SOCKET, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) {
|
||||
if (chmod(ctl_sock_path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) {
|
||||
log_warn("%s: chmod", __func__);
|
||||
close(fd);
|
||||
(void)unlink(LDPD_SOCKET);
|
||||
(void)unlink(ctl_sock_path);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@ -97,7 +97,7 @@ control_cleanup(void)
|
||||
{
|
||||
accept_del(control_fd);
|
||||
close(control_fd);
|
||||
unlink(LDPD_SOCKET);
|
||||
unlink(ctl_sock_path);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
|
@ -809,9 +809,9 @@ ldp_vty_connect(struct imsgbuf *ibuf)
|
||||
|
||||
memset(&s_un, 0, sizeof(s_un));
|
||||
s_un.sun_family = AF_UNIX;
|
||||
strlcpy(s_un.sun_path, LDPD_SOCKET, sizeof(s_un.sun_path));
|
||||
strlcpy(s_un.sun_path, ctl_sock_path, sizeof(s_un.sun_path));
|
||||
if (connect(ctl_sock, (struct sockaddr *)&s_un, sizeof(s_un)) == -1) {
|
||||
log_warn("%s: connect: %s", __func__, LDPD_SOCKET);
|
||||
log_warn("%s: connect: %s", __func__, ctl_sock_path);
|
||||
close(ctl_sock);
|
||||
return (-1);
|
||||
}
|
||||
|
57
ldpd/ldpd.c
57
ldpd/ldpd.c
@ -40,11 +40,12 @@
|
||||
#include "zclient.h"
|
||||
#include "vrf.h"
|
||||
#include "filter.h"
|
||||
#include "sockopt.h"
|
||||
#include "qobj.h"
|
||||
|
||||
static void ldpd_shutdown(void);
|
||||
static pid_t start_child(enum ldpd_process, char *, int, int,
|
||||
const char *, const char *);
|
||||
const char *, const char *, const char *);
|
||||
static int main_dispatch_ldpe(struct thread *);
|
||||
static int main_dispatch_lde(struct thread *);
|
||||
static int main_imsg_send_ipc_sockets(struct imsgbuf *,
|
||||
@ -116,7 +117,15 @@ struct zebra_privs_t ldpd_privs =
|
||||
.cap_num_i = 0
|
||||
};
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = LDP_VTYSH_PATH;
|
||||
|
||||
/* CTL Socket path */
|
||||
char ctl_sock_path[MAXPATHLEN] = LDPD_SOCKET;
|
||||
|
||||
/* LDPd options. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
#define OPTION_CTLSOCK 1001
|
||||
static struct option longopts[] =
|
||||
{
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
@ -127,6 +136,8 @@ static struct option longopts[] =
|
||||
{ "help", no_argument, NULL, 'h'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "ctl_socket", required_argument, NULL, OPTION_CTLSOCK},
|
||||
{ "user", required_argument, NULL, 'u'},
|
||||
{ "group", required_argument, NULL, 'g'},
|
||||
{ "version", no_argument, NULL, 'v'},
|
||||
@ -149,6 +160,8 @@ Daemon which manages LDP.\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
--ctl_socket Override ctl socket path\n\
|
||||
-u, --user User to run as\n\
|
||||
-g, --group Group to run as\n\
|
||||
-v, --version Print program version\n\
|
||||
@ -213,6 +226,8 @@ main(int argc, char *argv[])
|
||||
char *p;
|
||||
char *vty_addr = NULL;
|
||||
int vty_port = LDP_VTY_PORT;
|
||||
char *ctl_sock_custom_path = NULL;
|
||||
char *ctl_sock_name;
|
||||
int daemon_mode = 0;
|
||||
const char *user = NULL;
|
||||
const char *group = NULL;
|
||||
@ -273,6 +288,28 @@ main(int argc, char *argv[])
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = LDP_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, LDP_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case OPTION_CTLSOCK:
|
||||
ctl_sock_name = strrchr(LDPD_SOCKET, '/');
|
||||
if (ctl_sock_name)
|
||||
/* skip '/' */
|
||||
ctl_sock_name++;
|
||||
else
|
||||
/*
|
||||
* LDPD_SOCKET configured as relative path
|
||||
* during config? Should really never happen for
|
||||
* sensible config
|
||||
*/
|
||||
ctl_sock_name = (char *)LDPD_SOCKET;
|
||||
ctl_sock_custom_path = optarg;
|
||||
strlcpy(ctl_sock_path, ctl_sock_custom_path,
|
||||
sizeof(ctl_sock_path));
|
||||
strlcat(ctl_sock_path, "/", sizeof(ctl_sock_path));
|
||||
strlcat(ctl_sock_path, ctl_sock_name,
|
||||
sizeof(ctl_sock_path));
|
||||
break;
|
||||
case 'u':
|
||||
user = optarg;
|
||||
break;
|
||||
@ -319,7 +356,7 @@ main(int argc, char *argv[])
|
||||
if (lflag)
|
||||
lde(user, group);
|
||||
else if (eflag)
|
||||
ldpe(user, group);
|
||||
ldpe(user, group, ctl_sock_path);
|
||||
|
||||
master = thread_master_create();
|
||||
|
||||
@ -374,9 +411,11 @@ main(int argc, char *argv[])
|
||||
|
||||
/* start children */
|
||||
lde_pid = start_child(PROC_LDE_ENGINE, saved_argv0,
|
||||
pipe_parent2lde[1], pipe_parent2lde_sync[1], user, group);
|
||||
pipe_parent2lde[1], pipe_parent2lde_sync[1],
|
||||
user, group, ctl_sock_custom_path);
|
||||
ldpe_pid = start_child(PROC_LDP_ENGINE, saved_argv0,
|
||||
pipe_parent2ldpe[1], pipe_parent2ldpe_sync[1], user, group);
|
||||
pipe_parent2ldpe[1], pipe_parent2ldpe_sync[1],
|
||||
user, group, ctl_sock_custom_path);
|
||||
|
||||
/* drop privileges */
|
||||
if (user)
|
||||
@ -436,7 +475,7 @@ main(int argc, char *argv[])
|
||||
pid_output(pid_file);
|
||||
|
||||
/* Create VTY socket */
|
||||
vty_serv_sock(vty_addr, vty_port, LDP_VTYSH_PATH);
|
||||
vty_serv_sock(vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Print banner. */
|
||||
log_notice("LDPd %s starting: vty@%d", FRR_VERSION, vty_port);
|
||||
@ -494,9 +533,9 @@ ldpd_shutdown(void)
|
||||
|
||||
static pid_t
|
||||
start_child(enum ldpd_process p, char *argv0, int fd_async, int fd_sync,
|
||||
const char *user, const char *group)
|
||||
const char *user, const char *group, const char *ctl_sock_custom_path)
|
||||
{
|
||||
char *argv[7];
|
||||
char *argv[9];
|
||||
int argc = 0;
|
||||
pid_t pid;
|
||||
|
||||
@ -535,6 +574,10 @@ start_child(enum ldpd_process p, char *argv0, int fd_async, int fd_sync,
|
||||
argv[argc++] = (char *)"-g";
|
||||
argv[argc++] = (char *)group;
|
||||
}
|
||||
if (ctl_sock_custom_path) {
|
||||
argv[argc++] = (char *)"--ctl_socket";
|
||||
argv[argc++] = (char *)ctl_sock_custom_path;
|
||||
}
|
||||
argv[argc++] = NULL;
|
||||
|
||||
execvp(argv0, argv);
|
||||
|
@ -715,6 +715,7 @@ int sock_set_ipv6_mcast_loop(int);
|
||||
|
||||
/* quagga */
|
||||
extern struct thread_master *master;
|
||||
extern char ctl_sock_path[MAXPATHLEN];
|
||||
|
||||
/* ldp_zebra.c */
|
||||
void ldp_zebra_init(struct thread_master *);
|
||||
|
@ -99,7 +99,7 @@ static struct quagga_signal_t ldpe_signals[] =
|
||||
|
||||
/* label distribution protocol engine */
|
||||
void
|
||||
ldpe(const char *user, const char *group)
|
||||
ldpe(const char *user, const char *group, const char *ctl_path)
|
||||
{
|
||||
struct thread thread;
|
||||
|
||||
@ -128,6 +128,7 @@ ldpe(const char *user, const char *group)
|
||||
ldpe_privs.group = group;
|
||||
zprivs_init(&ldpe_privs);
|
||||
|
||||
strlcpy(ctl_sock_path, ctl_path, sizeof(ctl_sock_path));
|
||||
if (control_init() == -1)
|
||||
fatalx("control socket setup failed");
|
||||
|
||||
|
@ -187,7 +187,7 @@ int tlv_decode_fec_elm(struct nbr *, struct ldp_msg *, char *,
|
||||
uint16_t, struct map *);
|
||||
|
||||
/* ldpe.c */
|
||||
void ldpe(const char *, const char *);
|
||||
void ldpe(const char *, const char *, const char *);
|
||||
int ldpe_imsg_compose_parent(int, pid_t, void *,
|
||||
uint16_t);
|
||||
int ldpe_imsg_compose_lde(int, uint32_t, pid_t, void *,
|
||||
|
@ -326,6 +326,9 @@ prefix_list_get (afi_t afi, int orf, const char *name)
|
||||
return plist;
|
||||
}
|
||||
|
||||
static void prefix_list_trie_del (struct prefix_list *plist,
|
||||
struct prefix_list_entry *pentry);
|
||||
|
||||
/* Delete prefix-list from prefix_list_master and free it. */
|
||||
static void
|
||||
prefix_list_delete (struct prefix_list *plist)
|
||||
@ -339,6 +342,7 @@ prefix_list_delete (struct prefix_list *plist)
|
||||
for (pentry = plist->head; pentry; pentry = next)
|
||||
{
|
||||
next = pentry->next;
|
||||
prefix_list_trie_del (plist, pentry);
|
||||
prefix_list_entry_free (pentry);
|
||||
plist->count--;
|
||||
}
|
||||
|
21
lib/privs.c
21
lib/privs.c
@ -251,7 +251,8 @@ zprivs_caps_init (struct zebra_privs_t *zprivs)
|
||||
}
|
||||
|
||||
/* we have caps, we have no need to ever change back the original user */
|
||||
if (zprivs_state.zuid)
|
||||
/* only change uid if we don't have the correct one */
|
||||
if ((zprivs_state.zuid) && (zprivs_state.zsuid != zprivs_state.zuid))
|
||||
{
|
||||
if ( setreuid (zprivs_state.zuid, zprivs_state.zuid) )
|
||||
{
|
||||
@ -531,7 +532,8 @@ zprivs_caps_init (struct zebra_privs_t *zprivs)
|
||||
/* we have caps, we have no need to ever change back the original user
|
||||
* change real, effective and saved to the specified user.
|
||||
*/
|
||||
if (zprivs_state.zuid)
|
||||
/* only change uid if we don't have the correct one */
|
||||
if ((zprivs_state.zuid) && (zprivs_state.zsuid != zprivs_state.zuid))
|
||||
{
|
||||
if ( setreuid (zprivs_state.zuid, zprivs_state.zuid) )
|
||||
{
|
||||
@ -602,7 +604,8 @@ zprivs_caps_terminate (void)
|
||||
int
|
||||
zprivs_change_uid (zebra_privs_ops_t op)
|
||||
{
|
||||
|
||||
if (zprivs_state.zsuid == zprivs_state.zuid)
|
||||
return 0;
|
||||
if (op == ZPRIVS_RAISE)
|
||||
return seteuid (zprivs_state.zsuid);
|
||||
else if (op == ZPRIVS_LOWER)
|
||||
@ -766,7 +769,8 @@ zprivs_init(struct zebra_privs_t *zprivs)
|
||||
}
|
||||
}
|
||||
|
||||
if (ngroups)
|
||||
/* add groups only if we changed uid - otherwise skip */
|
||||
if ((ngroups) && (zprivs_state.zsuid != zprivs_state.zuid))
|
||||
{
|
||||
if ( setgroups (ngroups, groups) )
|
||||
{
|
||||
@ -776,7 +780,8 @@ zprivs_init(struct zebra_privs_t *zprivs)
|
||||
}
|
||||
}
|
||||
|
||||
if (zprivs_state.zgid)
|
||||
/* change gid only if we changed uid - otherwise skip */
|
||||
if ((zprivs_state.zgid) && (zprivs_state.zsuid != zprivs_state.zuid))
|
||||
{
|
||||
/* change group now, forever. uid we do later */
|
||||
if ( setregid (zprivs_state.zgid, zprivs_state.zgid) )
|
||||
@ -797,7 +802,8 @@ zprivs_init(struct zebra_privs_t *zprivs)
|
||||
* This is not worth that much security wise, but all we can do.
|
||||
*/
|
||||
zprivs_state.zsuid = geteuid();
|
||||
if ( zprivs_state.zuid )
|
||||
/* only change uid if we don't have the correct one */
|
||||
if (( zprivs_state.zuid ) && (zprivs_state.zsuid != zprivs_state.zuid))
|
||||
{
|
||||
if ( setreuid (-1, zprivs_state.zuid) )
|
||||
{
|
||||
@ -824,7 +830,8 @@ zprivs_terminate (struct zebra_privs_t *zprivs)
|
||||
#ifdef HAVE_CAPABILITIES
|
||||
zprivs_caps_terminate();
|
||||
#else /* !HAVE_CAPABILITIES */
|
||||
if (zprivs_state.zuid)
|
||||
/* only change uid if we don't have the correct one */
|
||||
if ((zprivs_state.zuid) && (zprivs_state.zsuid != zprivs_state.zuid))
|
||||
{
|
||||
if ( setreuid (zprivs_state.zuid, zprivs_state.zuid) )
|
||||
{
|
||||
|
@ -29,6 +29,29 @@
|
||||
#include "sockopt.h"
|
||||
#include "sockunion.h"
|
||||
|
||||
/* Replace the path of given defaultpath with newpath, but keep filename */
|
||||
void
|
||||
set_socket_path (char *path, const char *defaultpath, char *newpath, int maxsize)
|
||||
{
|
||||
const char *sock_name;
|
||||
|
||||
sock_name = strrchr(defaultpath, '/');
|
||||
if (sock_name)
|
||||
/* skip '/' */
|
||||
sock_name++;
|
||||
else
|
||||
/*
|
||||
* VTYSH_PATH configured as relative path
|
||||
* during config? Should really never happen for
|
||||
* sensible config
|
||||
*/
|
||||
sock_name = defaultpath;
|
||||
|
||||
strlcpy (path, newpath, maxsize);
|
||||
strlcat (path, "/", maxsize);
|
||||
strlcat (path, sock_name, maxsize);
|
||||
}
|
||||
|
||||
void
|
||||
setsockopt_so_recvbuf (int sock, int size)
|
||||
{
|
||||
|
@ -24,6 +24,10 @@
|
||||
|
||||
#include "sockunion.h"
|
||||
|
||||
/* Override (vty) socket paths, but keep the filename */
|
||||
extern void set_socket_path (char *path, const char *defaultpath,
|
||||
char *newpath, int maxsize);
|
||||
|
||||
extern void setsockopt_so_recvbuf (int sock, int size);
|
||||
extern void setsockopt_so_sendbuf (const int sock, int size);
|
||||
extern int getsockopt_so_sendbuf (const int sock);
|
||||
|
@ -2022,7 +2022,10 @@ vty_serv_un (const char *path)
|
||||
|
||||
zprivs_get_ids(&ids);
|
||||
|
||||
if (ids.gid_vty > 0)
|
||||
/* Hack: ids.gid_vty is actually a uint, but we stored -1 in it
|
||||
earlier for the case when we don't need to chown the file
|
||||
type casting it here to make a compare */
|
||||
if ((int)ids.gid_vty > 0)
|
||||
{
|
||||
/* set group of socket */
|
||||
if ( chown (path, -1, ids.gid_vty) )
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include "zclient.h"
|
||||
#include "vrf.h"
|
||||
#include "bfd.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "ospf6d.h"
|
||||
#include "ospf6_top.h"
|
||||
@ -51,6 +52,9 @@
|
||||
/* Default configuration file name for ospf6d. */
|
||||
#define OSPF6_DEFAULT_CONFIG "ospf6d.conf"
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = OSPF6_VTYSH_PATH;
|
||||
|
||||
/* Default port values. */
|
||||
#define OSPF6_VTY_PORT 2606
|
||||
|
||||
@ -78,6 +82,7 @@ struct zebra_privs_t ospf6d_privs =
|
||||
};
|
||||
|
||||
/* ospf6d options, we use GNU getopt library. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
struct option longopts[] =
|
||||
{
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
@ -86,6 +91,7 @@ struct option longopts[] =
|
||||
{ "socket", required_argument, NULL, 'z'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "user", required_argument, NULL, 'u'},
|
||||
{ "group", required_argument, NULL, 'g'},
|
||||
{ "version", no_argument, NULL, 'v'},
|
||||
@ -125,6 +131,7 @@ Daemon which manages OSPF version 3.\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-u, --user User to run as\n\
|
||||
-g, --group Group to run as\n\
|
||||
-v, --version Print program version\n\
|
||||
@ -285,6 +292,9 @@ main (int argc, char *argv[], char *envp[])
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = OSPF6_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, OSPF6_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'u':
|
||||
ospf6d_privs.user = optarg;
|
||||
break;
|
||||
@ -357,7 +367,7 @@ main (int argc, char *argv[], char *envp[])
|
||||
/* Make ospf6 vty socket. */
|
||||
if (!vty_port)
|
||||
vty_port = OSPF6_VTY_PORT;
|
||||
vty_serv_sock (vty_addr, vty_port, OSPF6_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Print start message */
|
||||
zlog_notice ("OSPF6d (Quagga-%s ospf6d-%s) starts: vty@%d",
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "sigevent.h"
|
||||
#include "zclient.h"
|
||||
#include "vrf.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "ospfd/ospfd.h"
|
||||
#include "ospfd/ospf_interface.h"
|
||||
@ -79,6 +80,7 @@ struct zebra_privs_t ospfd_privs =
|
||||
char config_default[100];
|
||||
|
||||
/* OSPFd options. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
struct option longopts[] =
|
||||
{
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
@ -90,6 +92,7 @@ struct option longopts[] =
|
||||
{ "help", no_argument, NULL, 'h'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "user", required_argument, NULL, 'u'},
|
||||
{ "group", required_argument, NULL, 'g'},
|
||||
{ "apiserver", no_argument, NULL, 'a'},
|
||||
@ -99,6 +102,9 @@ struct option longopts[] =
|
||||
|
||||
/* OSPFd program name */
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = OSPF_VTYSH_PATH;
|
||||
|
||||
/* Master of threads. */
|
||||
struct thread_master *master;
|
||||
|
||||
@ -126,6 +132,7 @@ Daemon which manages OSPF.\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-u, --user User to run as\n\
|
||||
-g, --group Group to run as\n\
|
||||
-a. --apiserver Enable OSPF apiserver\n\
|
||||
@ -253,6 +260,9 @@ main (int argc, char **argv)
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = OSPF_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, OSPF_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'u':
|
||||
ospfd_privs.user = optarg;
|
||||
break;
|
||||
@ -357,19 +367,48 @@ main (int argc, char **argv)
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* Create VTY socket */
|
||||
/* Create PID file */
|
||||
if (instance)
|
||||
{
|
||||
sprintf(pid_file, "%s/ospfd-%d.pid", DAEMON_VTY_DIR, instance);
|
||||
sprintf(vty_path, "%s/ospfd-%d.vty", DAEMON_VTY_DIR, instance);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(vty_path, OSPF_VTYSH_PATH);
|
||||
char pidfile_temp[100];
|
||||
|
||||
/* Override the single file with file including instance
|
||||
number in case of multi-instance */
|
||||
if (strrchr(pid_file, '/') != NULL)
|
||||
/* cut of pid_file at last / char * to get directory */
|
||||
*strrchr(pid_file, '/') = '\0';
|
||||
else
|
||||
/* pid_file contains no directory - should never happen, but deal with it anyway */
|
||||
/* throw-away all pid_file and assume it's only the filename */
|
||||
pid_file[0] = '\0';
|
||||
|
||||
snprintf(pidfile_temp, sizeof(pidfile_temp), "%s/ospfd-%d.pid", pid_file, instance );
|
||||
strncpy(pid_file, pidfile_temp, sizeof(pid_file));
|
||||
}
|
||||
/* Process id file create. */
|
||||
pid_output (pid_file);
|
||||
|
||||
/* Create VTY socket */
|
||||
if (instance)
|
||||
{
|
||||
/* Multi-Instance. Use only path section of vty_sock_path with new file incl instance */
|
||||
if (strrchr(vty_sock_path, '/') != NULL)
|
||||
{
|
||||
/* cut of pid_file at last / char * to get directory */
|
||||
*strrchr(vty_sock_path, '/') = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
/* pid_file contains no directory - should never happen, but deal with it anyway */
|
||||
/* throw-away all pid_file and assume it's only the filename */
|
||||
vty_sock_path[0] = '\0';
|
||||
}
|
||||
snprintf(vty_path, sizeof(vty_path), "%s/ospfd-%d.vty", vty_sock_path, instance );
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(vty_path, vty_sock_path);
|
||||
}
|
||||
vty_serv_sock (vty_addr, vty_port, vty_path);
|
||||
|
||||
/* Print banner. */
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "prefix.h"
|
||||
#include "plist.h"
|
||||
#include "vrf.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "pimd.h"
|
||||
#include "pim_version.h"
|
||||
@ -51,18 +52,25 @@ extern struct host host;
|
||||
|
||||
char config_default[] = SYSCONFDIR PIMD_DEFAULT_CONFIG;
|
||||
|
||||
/* pimd options */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
struct option longopts[] = {
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
{ "config_file", required_argument, NULL, 'f'},
|
||||
{ "pid_file", required_argument, NULL, 'i'},
|
||||
{ "socket", required_argument, NULL, 'z'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "version", no_argument, NULL, 'v'},
|
||||
{ "debug_zclient", no_argument, NULL, 'Z'},
|
||||
{ "help", no_argument, NULL, 'h'},
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = PIM_VTYSH_PATH;
|
||||
|
||||
/* pimd privileges */
|
||||
zebra_capabilities_t _caps_p [] =
|
||||
{
|
||||
@ -103,6 +111,7 @@ Daemon which manages PIM.\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-v, --version Print program version\n\
|
||||
-h, --help Display this help and exit\n\
|
||||
\n\
|
||||
@ -163,6 +172,9 @@ int main(int argc, char** argv, char** envp) {
|
||||
case 'P':
|
||||
vty_port = atoi (optarg);
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, PIM_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'v':
|
||||
printf(PIMD_PROGNAME " version %s\n", PIMD_VERSION);
|
||||
print_version(progname);
|
||||
@ -228,7 +240,7 @@ int main(int argc, char** argv, char** envp) {
|
||||
/* Create pimd VTY socket */
|
||||
if (vty_port < 0)
|
||||
vty_port = PIMD_VTY_PORT;
|
||||
vty_serv_sock(vty_addr, vty_port, PIM_VTYSH_PATH);
|
||||
vty_serv_sock(vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting, VTY interface at port TCP %d",
|
||||
FRR_VERSION, PIMD_VERSION, vty_port);
|
||||
|
@ -5,8 +5,8 @@ AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib $(Q
|
||||
PROTOBUF_INCLUDES=-I$(top_srcdir)
|
||||
PROTOBUF_PACKAGE = qpb
|
||||
|
||||
lib_LTLIBRARIES = libquagga_pb.la
|
||||
libquagga_pb_la_LDFLAGS = -version-info 0:0:0
|
||||
lib_LTLIBRARIES = libfrr_pb.la
|
||||
libfrr_pb_la_LDFLAGS = -version-info 0:0:0
|
||||
|
||||
if HAVE_PROTOBUF
|
||||
protobuf_srcs = \
|
||||
@ -16,14 +16,14 @@ protobuf_srcs_nodist = \
|
||||
qpb.pb-c.c
|
||||
endif
|
||||
|
||||
libquagga_pb_la_SOURCES = \
|
||||
libfrr_pb_la_SOURCES = \
|
||||
linear_allocator.h \
|
||||
qpb.h \
|
||||
qpb.c \
|
||||
qpb_allocator.h \
|
||||
$(protobuf_srcs)
|
||||
|
||||
nodist_libquagga_pb_la_SOURCES = $(protobuf_srcs_nodist)
|
||||
nodist_libfrr_pb_la_SOURCES = $(protobuf_srcs_nodist)
|
||||
|
||||
CLEANFILES = $(Q_CLEANFILES)
|
||||
BUILT_SOURCES = $(Q_PROTOBUF_SRCS)
|
||||
|
@ -1 +1 @@
|
||||
Protobuf definitions and code that is applicable to all of quagga.
|
||||
Protobuf definitions and code that is applicable to all of Quagga/FRR.
|
||||
|
@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Protobuf definitions pertaining to the Quagga Protobuf component.
|
||||
* Protobuf definitions pertaining to the Quagga/FRR Protobuf component.
|
||||
*/
|
||||
package qpb;
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Header file for quagga protobuf memory management code.
|
||||
* Header file for Quagga/FRR protobuf memory management code.
|
||||
*/
|
||||
|
||||
#ifndef _QPB_ALLOCATOR_H_
|
||||
|
@ -570,10 +570,10 @@ rm -rf %{buildroot}
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Jan 6 2017 Martin Winter <mwinter@opensourcerouting.org>
|
||||
* Fri Jan 6 2017 Martin Winter <mwinter@opensourcerouting.org> - %{version}
|
||||
- Renamed to frr for FreeRangeRouting fork of Quagga
|
||||
|
||||
* Thu Feb 11 2016 Paul Jakma <paul@jakma.org> - %{version}
|
||||
* Thu Feb 11 2016 Paul Jakma <paul@jakma.org>
|
||||
- remove with_ipv6 conditionals, always build v6
|
||||
- Fix UTF-8 char in spec changelog
|
||||
- remove quagga.pam.stack, long deprecated.
|
||||
|
@ -35,10 +35,12 @@
|
||||
#include "sigevent.h"
|
||||
#include "zclient.h"
|
||||
#include "vrf.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
|
||||
/* ripd options. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
static struct option longopts[] =
|
||||
{
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
@ -49,6 +51,7 @@ static struct option longopts[] =
|
||||
{ "dryrun", no_argument, NULL, 'C'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "retain", no_argument, NULL, 'r'},
|
||||
{ "user", required_argument, NULL, 'u'},
|
||||
{ "group", required_argument, NULL, 'g'},
|
||||
@ -85,6 +88,9 @@ char *config_file = NULL;
|
||||
|
||||
/* ripd program name */
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = RIP_VTYSH_PATH;
|
||||
|
||||
/* Route retain mode flag. */
|
||||
int retain_mode = 0;
|
||||
|
||||
@ -116,6 +122,7 @@ Daemon which manages RIP version 1 and 2.\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-C, --dryrun Check configuration for validity and exit\n\
|
||||
-r, --retain When program terminates, retain added route by ripd.\n\
|
||||
-u, --user User to run as\n\
|
||||
@ -142,7 +149,7 @@ sighup (void)
|
||||
vty_read_config (config_file, config_default);
|
||||
|
||||
/* Create VTY's socket */
|
||||
vty_serv_sock (vty_addr, vty_port, RIP_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Try to return to normal operation. */
|
||||
}
|
||||
@ -251,6 +258,9 @@ main (int argc, char **argv)
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = RIP_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, RIP_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'r':
|
||||
retain_mode = 1;
|
||||
break;
|
||||
@ -311,7 +321,7 @@ main (int argc, char **argv)
|
||||
pid_output (pid_file);
|
||||
|
||||
/* Create VTY's socket */
|
||||
vty_serv_sock (vty_addr, vty_port, RIP_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Print banner. */
|
||||
zlog_notice ("RIPd %s starting: vty@%d", FRR_VERSION, vty_port);
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "privs.h"
|
||||
#include "sigevent.h"
|
||||
#include "vrf.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "ripngd/ripngd.h"
|
||||
|
||||
@ -44,6 +45,7 @@ char config_default[] = SYSCONFDIR RIPNG_DEFAULT_CONFIG;
|
||||
char *config_file = NULL;
|
||||
|
||||
/* RIPngd options. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
struct option longopts[] =
|
||||
{
|
||||
{ "daemon", no_argument, NULL, 'd'},
|
||||
@ -54,6 +56,7 @@ struct option longopts[] =
|
||||
{ "help", no_argument, NULL, 'h'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "retain", no_argument, NULL, 'r'},
|
||||
{ "user", required_argument, NULL, 'u'},
|
||||
{ "group", required_argument, NULL, 'g'},
|
||||
@ -87,6 +90,9 @@ struct zebra_privs_t ripngd_privs =
|
||||
|
||||
/* RIPngd program name */
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = RIPNG_VTYSH_PATH;
|
||||
|
||||
/* Route retain mode flag. */
|
||||
int retain_mode = 0;
|
||||
|
||||
@ -118,6 +124,7 @@ Daemon which manages RIPng.\n\n\
|
||||
-z, --socket Set path of zebra socket\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
--vty_socket Override vty socket path\n\
|
||||
-r, --retain When program terminates, retain added route by ripngd.\n\
|
||||
-u, --user User to run as\n\
|
||||
-g, --group Group to run as\n\
|
||||
@ -141,7 +148,7 @@ sighup (void)
|
||||
/* Reload config file. */
|
||||
vty_read_config (config_file, config_default);
|
||||
/* Create VTY's socket */
|
||||
vty_serv_sock (vty_addr, vty_port, RIPNG_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Try to return to normal operation. */
|
||||
}
|
||||
@ -249,6 +256,9 @@ main (int argc, char **argv)
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = RIPNG_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, RIPNG_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'r':
|
||||
retain_mode = 1;
|
||||
break;
|
||||
@ -303,7 +313,7 @@ main (int argc, char **argv)
|
||||
}
|
||||
|
||||
/* Create VTY socket */
|
||||
vty_serv_sock (vty_addr, vty_port, RIPNG_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Process id file create. */
|
||||
pid_output (pid_file);
|
||||
|
6
snapcraft/.gitignore
vendored
Normal file
6
snapcraft/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
snapcraft.yaml
|
||||
parts
|
||||
prime
|
||||
stage
|
||||
quagga*.snap
|
||||
!*/Makefile
|
11
snapcraft/Makefile.am
Normal file
11
snapcraft/Makefile.am
Normal file
@ -0,0 +1,11 @@
|
||||
EXTRA_DIST = snapcraft.yaml \
|
||||
scripts/Makefile scripts/zebra-service scripts/bgpd-service \
|
||||
scripts/isisd-service scripts/ripd-service scripts/ripngd-service \
|
||||
scripts/ospf6d-service scripts/ospfd-service \
|
||||
scripts/isisd-service scripts/pimd-service \
|
||||
scripts/ldpd-service \
|
||||
defaults/bgpd.conf.default defaults/isisd.conf.default \
|
||||
defaults/ospf6d.conf.default defaults/ospfd.conf.default \
|
||||
defaults/pimd.conf.default defaults/zebra.conf.default \
|
||||
defaults/ripd.conf.default defaults/ripngd.conf.default \
|
||||
defaults/ldpd.conf.default defaults/vtysh.conf.default
|
93
snapcraft/README.snap_build.md
Normal file
93
snapcraft/README.snap_build.md
Normal file
@ -0,0 +1,93 @@
|
||||
Building your own FreeRangeRouting Snap
|
||||
========================================
|
||||
(Tested on Ubuntu 16.04 with Snap Version 2, does not work on Ubuntu 15.x
|
||||
which uses earlier versions of snaps)
|
||||
|
||||
1. Install snapcraft:
|
||||
|
||||
sudo apt-get install snapcraft
|
||||
|
||||
2. Checkout FreeRangeRouting under a **unpriviledged** user account
|
||||
|
||||
git clone https://github.com/freerangerouting/frr.git
|
||||
cd frr
|
||||
|
||||
3. Run Bootstrap and make distribution tar.gz
|
||||
|
||||
./bootstrap.sh
|
||||
./configure --with-pkg-extra-version=-MySnapVersion
|
||||
make dist
|
||||
|
||||
Note: configure parameters are not important for the Snap building,
|
||||
except the `with-pkg-extra-version` if you want to give the Snap
|
||||
a specific name to mark your own unoffical build
|
||||
|
||||
This will build `frr-something.tar.gz` - the distribution tar and
|
||||
the snapcraft/snapcraft.yaml with the matching version number
|
||||
|
||||
4. Create snap
|
||||
|
||||
cd snapcraft
|
||||
snapcraft
|
||||
|
||||
You should now end up with `frr_something.snap`
|
||||
|
||||
Installing the snap
|
||||
===================
|
||||
(This can be done on a different system)
|
||||
|
||||
1. Install snapd
|
||||
|
||||
sudo apt-get install snapd
|
||||
|
||||
2. Install self-built frr snap. (`--force-dangerous` is required to
|
||||
install a unsigned self-built snap)
|
||||
|
||||
snap install --force-dangerous ./frr*.snap
|
||||
|
||||
Connect the priviledged `network-control` plug to the snap:
|
||||
|
||||
snap connect frr:network-control ubuntu-core:network-control
|
||||
|
||||
DONE.
|
||||
|
||||
The Snap will be auto-started and running.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
### FreeRangeRouting Daemons
|
||||
At this time, all FreeRangeRouting daemons are auto-started.
|
||||
|
||||
A daemon can be stopped/started with (ie ospf6d)
|
||||
|
||||
systemctl stop snap.frr.ospf6d.service
|
||||
systemctl start snap.frr.ospf6d.service
|
||||
|
||||
or disabled/enabled with
|
||||
|
||||
systemctl disable snap.frr.ospf6d.service
|
||||
systemctl enable snap.frr.ospf6d.service
|
||||
|
||||
### FreeRangeRouting Commands
|
||||
All the commands are prefixed with frr.
|
||||
|
||||
frr.vtysh -> vtysh
|
||||
frr.version -> Just gives version output (zebra --version)
|
||||
frr.readme -> Returns simple README with hints on using FRR
|
||||
|
||||
frr.bgpd-debug -> Directly start each daemon (without service)
|
||||
frr.isisd-debug
|
||||
frr.ospf6d-debug
|
||||
frr.ospfd-debug
|
||||
frr.pimd-debug
|
||||
frr.ripd-debug
|
||||
frr.ripngd-debug
|
||||
frr.ldp-debug
|
||||
frr.zebra-debug
|
||||
|
||||
vtysh can be accessed as frr.vtysh (Make sure you have /snap/bin in your
|
||||
path). If access as `vtysh` instead of `frr.vtysh` is needed, a symlink
|
||||
can be created:
|
||||
|
||||
sudo ln -s /snap/bin/frr.vtysh /usr/local/bin/vtysh
|
77
snapcraft/README.usage.md
Normal file
77
snapcraft/README.usage.md
Normal file
@ -0,0 +1,77 @@
|
||||
Using the FreeRangeRouting Snap
|
||||
===============================
|
||||
|
||||
After installing the Snap, the priviledged plug need to be connected:
|
||||
|
||||
snap connect frr:network-control ubuntu-core:network-control
|
||||
|
||||
Enabling/Disabling FreeRangeRouting Daemons
|
||||
-------------------------------------------
|
||||
|
||||
By default (at this time), all FreeRangeRouting daemons will be enabled
|
||||
on installation. If you want to disable a specific daemon, then use
|
||||
the systemctl commands
|
||||
|
||||
ie for `ospf6d` (OSPFv3):
|
||||
|
||||
systemctl disable snap.frr.ospf6d.service
|
||||
systemctl enable snap.frr.ospf6d.service
|
||||
|
||||
The daemons are: `ripd`, `ripngd`, `ospfd`, `ospf6d`, `isisd`, `bgpd`,
|
||||
`pimd`, `zebra`
|
||||
|
||||
Commands defined by this snap
|
||||
-----------------------------
|
||||
|
||||
- `frr.vtysh`:
|
||||
FreeRangeRouting VTY Shell (configuration tool)
|
||||
- `frr.version`:
|
||||
Returns output of `zebra --version` to display version and configured
|
||||
options
|
||||
- `frr.readme`:
|
||||
Returns this document `cat README_usage.md`
|
||||
|
||||
and for debugging defined at this time (May get removed later - do not
|
||||
depend on them). These are mainly intended to debug the Snap
|
||||
|
||||
- `frr.zebra-debug`:
|
||||
Starts zebra daemon in foreground
|
||||
- `frr.ripd-debug`:
|
||||
Starts ripd daemon in foreground
|
||||
- `frr.ripngd-debug`:
|
||||
Starts ripng daemon in foreground
|
||||
- `frr.ospfd-debug`:
|
||||
Starts ospfd daemon in foreground
|
||||
- `frr.ospf6d-debug`:
|
||||
Starts ospf6d daemon in foreground
|
||||
- `frr.isisd-debug`:
|
||||
Starts isisd daemon in foreground
|
||||
- `frr.bgpd-debug`:
|
||||
Starts bgpd daemon in foreground
|
||||
- `frr.pimd-debug`:
|
||||
Starts pimd daemon in foreground
|
||||
- `frr.ldpd-debug`:
|
||||
Starts ldpd daemon in foreground
|
||||
|
||||
FAQ
|
||||
---
|
||||
- frr.vtysh displays `--MORE--` on long output. How to suppress this?
|
||||
- Define `VTYSH_PAGER` to `cat` (default is `more`). (Ie add
|
||||
`export VTYSH_PAGER=cat` to the end of your `.profile`)
|
||||
|
||||
Sourcecode available
|
||||
====================
|
||||
|
||||
The source for this SNAP is available as part of the FreeRangeRouting
|
||||
Source Code Distribution.
|
||||
|
||||
https://github.com/freerangerouting/frr.git
|
||||
|
||||
Instructions for rebuilding the snap are in `README.snap_build.md`
|
||||
|
||||
Feedback welcome
|
||||
================
|
||||
|
||||
Please send Feedback about this snap to Martin Winter at
|
||||
`mwinter@opensourcerouting.org`
|
||||
|
0
snapcraft/defaults/bgpd.conf.default
Normal file
0
snapcraft/defaults/bgpd.conf.default
Normal file
0
snapcraft/defaults/isisd.conf.default
Normal file
0
snapcraft/defaults/isisd.conf.default
Normal file
0
snapcraft/defaults/ldpd.conf.default
Normal file
0
snapcraft/defaults/ldpd.conf.default
Normal file
0
snapcraft/defaults/ospf6d.conf.default
Normal file
0
snapcraft/defaults/ospf6d.conf.default
Normal file
0
snapcraft/defaults/ospfd.conf.default
Normal file
0
snapcraft/defaults/ospfd.conf.default
Normal file
0
snapcraft/defaults/pimd.conf.default
Normal file
0
snapcraft/defaults/pimd.conf.default
Normal file
0
snapcraft/defaults/ripd.conf.default
Normal file
0
snapcraft/defaults/ripd.conf.default
Normal file
0
snapcraft/defaults/ripngd.conf.default
Normal file
0
snapcraft/defaults/ripngd.conf.default
Normal file
1
snapcraft/defaults/vtysh.conf.default
Normal file
1
snapcraft/defaults/vtysh.conf.default
Normal file
@ -0,0 +1 @@
|
||||
no service integrated-vtysh-config
|
0
snapcraft/defaults/zebra.conf.default
Normal file
0
snapcraft/defaults/zebra.conf.default
Normal file
7
snapcraft/helpers/Makefile
Normal file
7
snapcraft/helpers/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
all:
|
||||
|
||||
install:
|
||||
install -D -m 0755 $(DESTDIR)/usr/bin/telnet.netkit $(DESTDIR)/bin/telnet
|
||||
install -D -m 0755 $(DESTDIR)/usr/bin/traceroute.db $(DESTDIR)/bin/traceroute
|
||||
install -D -m 0755 $(DESTDIR)/usr/bin/traceroute6.db $(DESTDIR)/bin/traceroute6
|
||||
|
14
snapcraft/scripts/Makefile
Normal file
14
snapcraft/scripts/Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
all:
|
||||
|
||||
install:
|
||||
mkdir -p $(DESTDIR)/bin
|
||||
install -D -m 0755 zebra-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 bgpd-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 ospfd-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 ospf6d-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 ripd-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 ripngd-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 isisd-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 pimd-service $(DESTDIR)/bin/
|
||||
install -D -m 0755 ldpd-service $(DESTDIR)/bin/
|
||||
|
13
snapcraft/scripts/bgpd-service
Normal file
13
snapcraft/scripts/bgpd-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/bgpd.conf ]; then
|
||||
cp $SNAP/etc/frr/bgpd.conf.default $SNAP_DATA/bgpd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/bgpd \
|
||||
-f $SNAP_DATA/bgpd.conf \
|
||||
--pid_file $SNAP_DATA/bgpd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
13
snapcraft/scripts/isisd-service
Normal file
13
snapcraft/scripts/isisd-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/isisd.conf ]; then
|
||||
cp $SNAP/etc/frr/isisd.conf.default $SNAP_DATA/isisd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/isisd \
|
||||
-f $SNAP_DATA/isisd.conf \
|
||||
--pid_file $SNAP_DATA/isisd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
14
snapcraft/scripts/ldpd-service
Normal file
14
snapcraft/scripts/ldpd-service
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/ldpd.conf ]; then
|
||||
cp $SNAP/etc/frr/ldpd.conf.default $SNAP_DATA/ldpd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/ldpd \
|
||||
-f $SNAP_DATA/ldpd.conf \
|
||||
--pid_file $SNAP_DATA/ldpd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--ctl_socket $SNAP_DATA \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
13
snapcraft/scripts/ospf6d-service
Normal file
13
snapcraft/scripts/ospf6d-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/ospf6d.conf ]; then
|
||||
cp $SNAP/etc/frr/ospf6d.conf.default $SNAP_DATA/ospf6d.conf
|
||||
fi
|
||||
exec $SNAP/sbin/ospf6d \
|
||||
-f $SNAP_DATA/ospf6d.conf \
|
||||
--pid_file $SNAP_DATA/ospf6d.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
13
snapcraft/scripts/ospfd-service
Normal file
13
snapcraft/scripts/ospfd-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/ospfd.conf ]; then
|
||||
cp $SNAP/etc/frr/ospfd.conf.default $SNAP_DATA/ospfd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/ospfd \
|
||||
-f $SNAP_DATA/ospfd.conf \
|
||||
--pid_file $SNAP_DATA/ospfd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
13
snapcraft/scripts/pimd-service
Normal file
13
snapcraft/scripts/pimd-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/pimd.conf ]; then
|
||||
cp $SNAP/etc/frr/pimd.conf.default $SNAP_DATA/pimd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/pimd \
|
||||
-f $SNAP_DATA/pimd.conf \
|
||||
--pid_file $SNAP_DATA/pimd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
13
snapcraft/scripts/ripd-service
Normal file
13
snapcraft/scripts/ripd-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/ripd.conf ]; then
|
||||
cp $SNAP/etc/frr/ripd.conf.default $SNAP_DATA/ripd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/ripd \
|
||||
-f $SNAP_DATA/ripd.conf \
|
||||
--pid_file $SNAP_DATA/ripd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
13
snapcraft/scripts/ripngd-service
Normal file
13
snapcraft/scripts/ripngd-service
Normal file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/ripngd.conf ]; then
|
||||
cp $SNAP/etc/frr/ripngd.conf.default $SNAP_DATA/ripngd.conf
|
||||
fi
|
||||
exec $SNAP/sbin/ripngd \
|
||||
-f $SNAP_DATA/ripngd.conf \
|
||||
--pid_file $SNAP_DATA/ripngd.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
16
snapcraft/scripts/zebra-service
Normal file
16
snapcraft/scripts/zebra-service
Normal file
@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
if ! [ -e $SNAP_DATA/zebra.conf ]; then
|
||||
cp $SNAP/etc/frr/zebra.conf.default $SNAP_DATA/zebra.conf
|
||||
fi
|
||||
if ! [ -e $SNAP_DATA/vtysh.conf ]; then
|
||||
cp $SNAP/etc/frr/vtysh.conf.default $SNAP_DATA/vtysh.conf
|
||||
fi
|
||||
exec $SNAP/sbin/zebra \
|
||||
-f $SNAP_DATA/zebra.conf \
|
||||
--pid_file $SNAP_DATA/zebra.pid \
|
||||
--socket $SNAP_DATA/zsock \
|
||||
--vty_socket $SNAP_DATA
|
||||
|
BIN
snapcraft/setup/gui/icon.png
Normal file
BIN
snapcraft/setup/gui/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
235
snapcraft/snapcraft.yaml.in
Normal file
235
snapcraft/snapcraft.yaml.in
Normal file
@ -0,0 +1,235 @@
|
||||
name: frr
|
||||
version: @VERSION@
|
||||
summary: FreeRangeRouting BGP/OSPFv2/OSPFv3/ISIS/RIP/RIPng/PIM/LDP routing daemon
|
||||
description: BGP/OSPFv2/OSPFv3/ISIS/RIP/RIPng/PIM routing daemon
|
||||
FreeRangeRouting (FRR) is free software which manages TCP/IP based routing
|
||||
protocols. It supports BGP4, BGP4+, OSPFv2, OSPFv3, IS-IS, RIPv1, RIPv2,
|
||||
RIPng, PIM and LDP as well as the IPv6 versions of these.
|
||||
FreeRangeRouting (frr) is a fork of Quagga.
|
||||
confinement: strict
|
||||
grade: devel
|
||||
|
||||
apps:
|
||||
vtysh:
|
||||
command: bin/vtysh --vty_socket $SNAP_DATA --config_dir $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
version:
|
||||
command: sbin/zebra --version
|
||||
readme:
|
||||
command: bin/cat $SNAP/doc/README.usage.md
|
||||
zebra:
|
||||
command: bin/zebra-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
bgpd:
|
||||
command: bin/bgpd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ospfd:
|
||||
command: bin/ospfd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ospf6d:
|
||||
command: bin/ospf6d-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
isisd:
|
||||
command: bin/isisd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ripd:
|
||||
command: bin/ripd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ripngd:
|
||||
command: bin/ripngd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
pimd:
|
||||
command: bin/pimd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ldpd:
|
||||
command: bin/ldpd-service
|
||||
daemon: simple
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
zebra-debug:
|
||||
command: sbin/zebra -f $SNAP_DATA/zebra.conf --pid_file $SNAP_DATA/zebra.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
bgpd-debug:
|
||||
command: sbin/bgpd -f $SNAP_DATA/bgpd.conf --pid_file $SNAP_DATA/bgpd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ospfd-debug:
|
||||
command: sbin/ospfd -f $SNAP_DATA/ospfd.conf --pid_file $SNAP_DATA/ospfd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ospf6d-debug:
|
||||
command: sbin/ospf6d -f $SNAP_DATA/ospf6d.conf --pid_file $SNAP_DATA/ospf6d.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
isisd-debug:
|
||||
command: sbin/isisd -f $SNAP_DATA/isisd.conf --pid_file $SNAP_DATA/isisd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ripd-debug:
|
||||
command: sbin/ripd -f $SNAP_DATA/ripd.conf --pid_file $SNAP_DATA/ripd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ripngd-debug:
|
||||
command: sbin/ripngd -f $SNAP_DATA/ripngd.conf --pid_file $SNAP_DATA/ripngd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
pimd-debug:
|
||||
command: sbin/pimd -f $SNAP_DATA/pimd.conf --pid_file $SNAP_DATA/pimd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
ldpd-debug:
|
||||
command: sbin/ldpd -f $SNAP_DATA/pimd.conf --pid_file $SNAP_DATA/pimd.pid --socket $SNAP_DATA/zsock --ctl_socket $SNAP_DATA --vty_socket $SNAP_DATA
|
||||
plugs:
|
||||
- network
|
||||
- network-bind
|
||||
- network-control
|
||||
|
||||
parts:
|
||||
frr:
|
||||
build-packages:
|
||||
- autoconf
|
||||
- automake
|
||||
- libtool
|
||||
- make
|
||||
- gawk
|
||||
- libreadline-dev
|
||||
- texinfo
|
||||
- dejagnu
|
||||
- libncurses5-dev
|
||||
- texlive-latex-base
|
||||
- texlive-generic-recommended
|
||||
- libcap-dev
|
||||
- imagemagick
|
||||
- ghostscript
|
||||
- groff
|
||||
- hardening-wrapper
|
||||
- libpcre3-dev
|
||||
- chrpath
|
||||
- pkg-config
|
||||
- libjson-c-dev
|
||||
stage-packages:
|
||||
- coreutils
|
||||
- iproute2
|
||||
- logrotate
|
||||
- libcap2
|
||||
- libc6
|
||||
- libtinfo5
|
||||
- libreadline6
|
||||
- libjson-c2
|
||||
plugin: autotools
|
||||
source: ../frr-@PACKAGE_VERSION@.tar.gz
|
||||
configflags:
|
||||
- --with-cflags=-g
|
||||
- --with-cflags=-O0
|
||||
- --with-cflags=-std=gnu99
|
||||
- --with-cflags=-fpie
|
||||
- --with-cflags=-fno-omit-frame-pointer
|
||||
- --with-cflags=-Wall
|
||||
- --enable-vtysh
|
||||
- --enable-isisd
|
||||
- --enable-watchfrr
|
||||
- --enable-ospfclient=yes
|
||||
- --enable-ospfapi=yes
|
||||
- --enable-multipath=64
|
||||
- --enable-rtadv
|
||||
- --enable-irdp
|
||||
- --enable-gcc-rdynamic
|
||||
- --enable-user=root
|
||||
- --enable-group=root
|
||||
- --enable-pimd
|
||||
- --enable-ldpd
|
||||
- --enable-configfile-mask=0640
|
||||
- --enable-logfile-mask=0640
|
||||
- --localstatedir=/var/run
|
||||
- --sbindir=/sbin
|
||||
- --bindir=/bin
|
||||
- --sysconfdir=/etc/frr
|
||||
- --with-pkg-extra-version=@PACKAGE_EXTRAVERSION@
|
||||
frr-defaults:
|
||||
plugin: dump
|
||||
source: defaults
|
||||
organize:
|
||||
zebra.conf.default: etc/frr/zebra.conf.default
|
||||
bgpd.conf.default: etc/frr/bgpd.conf.default
|
||||
isisd.conf.default: etc/frr/isisd.conf.default
|
||||
ospf6d.conf.default: etc/frr/ospf6d.conf.default
|
||||
ospfd.conf.default: etc/frr/ospfd.conf.default
|
||||
pimd.conf.default: etc/frr/pimd.conf.default
|
||||
ripd.conf.default: etc/frr/ripd.conf.default
|
||||
ripngd.conf.default: etc/frr/ripngd.conf.default
|
||||
ldpd.conf.default: etc/frr/ldpd.conf.default
|
||||
vtysh.conf.default: etc/frr/vtysh.conf.default
|
||||
frr-scripts:
|
||||
plugin: make
|
||||
source: scripts
|
||||
helpers:
|
||||
stage-packages:
|
||||
- telnet
|
||||
- traceroute
|
||||
plugin: make
|
||||
source: helpers
|
||||
prime:
|
||||
- bin/telnet
|
||||
- bin/traceroute
|
||||
- bin/traceroute6
|
||||
docs:
|
||||
plugin: dump
|
||||
source: .
|
||||
organize:
|
||||
README.usage.md: doc/README.usage.md
|
||||
README.snap_build.md: doc/README.snap_build.md
|
||||
|
@ -7,13 +7,13 @@
|
||||
# the names of the various subpackages, and some convenient
|
||||
# derived variables.
|
||||
pkg_names = daemons dev doc libs smf
|
||||
pkg_quagga_daemons = zebra bgpd ospfd ospf6d ripd ripngd
|
||||
pkg_frr_daemons = zebra bgpd ospfd ospf6d ripd ripngd
|
||||
pkg_name_rev = @PACKAGE_VERSION@-@CONFDATE@-@target_os@-@target_cpu@
|
||||
pkg_depends = $(pkg_names:%=depend.%)
|
||||
pkg_packages = $(pkg_names:%=@PACKAGE_TARNAME@-%-$(pkg_name_rev).pkg)
|
||||
pkg_pkginfos = $(pkg_names:%=pkginfo.%.full)
|
||||
pkg_prototypes = $(pkg_names:%=prototype.%)
|
||||
pkg_manifests = quagga.xml
|
||||
pkg_manifests = frr.xml
|
||||
|
||||
# pkgmk variable substitutions wont grok ${variable} in prototype
|
||||
# file, so we cant let autoconf generate the file sadly
|
||||
@ -35,7 +35,7 @@ edit = $(SED) \
|
||||
-e 's,@enable_user\@,$(enable_user),g' \
|
||||
-e 's,@enable_group\@,$(enable_group),g' \
|
||||
-e 's,@enable_vty_group\@,$(enable_vty_group),g' \
|
||||
-e 's,@quagga_statedir\@,$(quagga_statedir),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' \
|
||||
@ -90,15 +90,15 @@ depend.%: $(srcdir)/depend.%.in Makefile
|
||||
$(edit) $< > $@
|
||||
|
||||
# method file (bit like init script)
|
||||
quagga.init: $(srcdir)/quagga.init.in Makefile
|
||||
frr.init: $(srcdir)/frr.init.in Makefile
|
||||
rm -f $@
|
||||
$(edit) $< > $@
|
||||
|
||||
# construct the pkg
|
||||
@PACKAGE_TARNAME@-%-$(pkg_name_rev).pkg: prototype.% \
|
||||
depend.% quagga.init pkginfo.%.full
|
||||
depend.% frr.init pkginfo.%.full
|
||||
($(pkg_make) && \
|
||||
$(pkg_trans) "QUAGGA$*")
|
||||
$(pkg_trans) "FRR$*")
|
||||
|
||||
%.pkg.gz : %.pkg
|
||||
(gzip -c $< > $@)
|
||||
@ -107,17 +107,17 @@ quagga.init: $(srcdir)/quagga.init.in Makefile
|
||||
#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) quagga.init
|
||||
$(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) quagga.init.in README.txt
|
||||
$(pkg_depends:%=%.in) frr.init.in README.txt
|
||||
|
||||
pkg-root-install:
|
||||
(cd $(top_builddir) && \
|
||||
$(MAKE) DESTDIR=$(abs_builddir)/quagga-root install)
|
||||
$(MAKE) DESTDIR=$(abs_builddir)/frr-root install)
|
||||
|
||||
packages: $(pkg_packages)
|
||||
|
||||
|
@ -15,21 +15,20 @@ Requirements:
|
||||
|
||||
i.manifest must be at least version 1.5. Place these scripts in
|
||||
this directory if you are using Solaris 10 GA (which does not ship with
|
||||
these scripts), or in the solaris/ directory in the Quagga source.
|
||||
these scripts), or in the solaris/ directory in the FreeRangeRouting source.
|
||||
|
||||
|
||||
Package creation instructions:
|
||||
------------------------------
|
||||
|
||||
1. Configure and build Quagga in the top level build directory as per
|
||||
normal, eg:
|
||||
1. Configure and build FreeRangeRouting (frr) in the top level build directory as per normal, eg:
|
||||
|
||||
./configure --prefix=/usr/local/quagga \
|
||||
--localstatedir=/var/run/quagga
|
||||
./configure --prefix=/usr/local/frr \
|
||||
--localstatedir=/var/run/frr \
|
||||
--enable-gcc-rdynamic --enable-opaque-lsa --enable-ospf-te \
|
||||
--enable-multipath=64 --enable-user=quagga \
|
||||
--enable-multipath=64 --enable-user=frr \
|
||||
--enable-ospfclient=yes --enable-ospfapi=yes \
|
||||
--enable-group=quagga --enable-nssa --enable-opaque-lsa
|
||||
--enable-group=frr --enable-nssa --enable-opaque-lsa
|
||||
|
||||
You will need /usr/sfw/bin and /usr/ccs/bin in your path.
|
||||
|
||||
@ -45,13 +44,13 @@ appropriate, eg:
|
||||
|
||||
This should result in 4 packages being created:
|
||||
|
||||
quagga-libs-...-$ARCH.pkg - QUAGGAlibs
|
||||
quagga-daemons-...-$ARCH.pkg - QUAGGAdaemons
|
||||
quagga-doc-...-$ARCH.pkg - QUAGGAdoc
|
||||
quagga-dev-...-$ARCH.pkg - QUAGGAdev
|
||||
quagga-smf-...-$ARCH.pkg - QUAGGAsmf
|
||||
frr-libs-...-$ARCH.pkg - FRRlibs
|
||||
frr-daemons-...-$ARCH.pkg - FRRdaemons
|
||||
frr-doc-...-$ARCH.pkg - FRRdoc
|
||||
frr-dev-...-$ARCH.pkg - FRRdev
|
||||
frr-smf-...-$ARCH.pkg - FRRsmf
|
||||
|
||||
QUAGGAlibs and QUAGGAdaemons are needed for daemon runtime. QUAGGAsmf
|
||||
FRRlibs and FRRdaemons are needed for daemon runtime. FRRsmf
|
||||
provides the required bits for Solaris 10+ SMF support.
|
||||
|
||||
|
||||
@ -59,7 +58,7 @@ Install and post-install configuration notes:
|
||||
---------------------------------------------
|
||||
|
||||
- If you specified a user/group which does not exist per default on Solaris
|
||||
(eg quagga/quagga) you *must* create these before installing these on a
|
||||
(eg frr/frr) you *must* create these before installing these on a
|
||||
system. The packages do *not* create the users.
|
||||
|
||||
- The configuration files are not created. You must create the configuration
|
||||
@ -69,107 +68,107 @@ Install and post-install configuration notes:
|
||||
|
||||
password whatever
|
||||
|
||||
The user which quagga runs as must have write permissions on this file, no
|
||||
The user which frr runs as must have write permissions on this file, no
|
||||
other user should have read permissions, and you would also have to enable
|
||||
the telnet interface (see below).
|
||||
|
||||
- SMF notes:
|
||||
|
||||
- QUAGGAsmf installs a svc:/network/routing/quagga service, with an
|
||||
- FRRsmf installs a svc:/network/routing/frr service, with an
|
||||
instance for each daemon
|
||||
|
||||
- The state of all instances of quagga service can be inspected with:
|
||||
- The state of all instances of frr service can be inspected with:
|
||||
|
||||
svcs -l svc:/network/routing/quagga
|
||||
svcs -l svc:/network/routing/frr
|
||||
|
||||
or typically just with a shortcut of 'quagga':
|
||||
or typically just with a shortcut of 'frr':
|
||||
|
||||
svcs -l quagga
|
||||
svcs -l frr
|
||||
|
||||
- A specific instance of the quagga service can be inspected by specifying
|
||||
the daemon name as the instance, ie quagga:<daemon>:
|
||||
- A specific instance of the frr service can be inspected by specifying
|
||||
the daemon name as the instance, ie frr:<daemon>:
|
||||
|
||||
svcs -l svc:/network/routing/quagga:zebra
|
||||
svcs -l svc:/network/routing/quagga:ospfd
|
||||
svcs -l svc:/network/routing/frr:zebra
|
||||
svcs -l svc:/network/routing/frr:ospfd
|
||||
<etc>
|
||||
|
||||
or typically just with the shortcut of 'quagga:<daemon>' or even
|
||||
or typically just with the shortcut of 'frr:<daemon>' or even
|
||||
<daemon>:
|
||||
|
||||
svcs -l quagga:zebra
|
||||
svcs -l frr:zebra
|
||||
svcs -l ospfd
|
||||
|
||||
Eg:
|
||||
|
||||
# # svcs -l ripd
|
||||
fmri svc:/network/routing/quagga:ripd
|
||||
name Quagga: ripd, RIPv1/2 IPv4 routing protocol daemon.
|
||||
fmri svc:/network/routing/frr:ripd
|
||||
name FreeRangeRouting: ripd, RIPv1/2 IPv4 routing protocol daemon.
|
||||
enabled true
|
||||
state online
|
||||
next_state none
|
||||
state_time Wed Jun 15 16:21:02 2005
|
||||
logfile /var/svc/log/network-routing-quagga:ripd.log
|
||||
logfile /var/svc/log/network-routing-frr:ripd.log
|
||||
restarter svc:/system/svc/restarter:default
|
||||
contract_id 93
|
||||
dependency require_all/restart svc:/network/routing/quagga:zebra (online)
|
||||
dependency require_all/restart file://localhost//usr/local/quagga/etc/ripd.conf (online)
|
||||
dependency require_all/restart svc:/network/routing/frr:zebra (online)
|
||||
dependency require_all/restart file://localhost//usr/local/frr/etc/ripd.conf (online)
|
||||
dependency require_all/none svc:/system/filesystem/usr:default (online)
|
||||
dependency require_all/none svc:/network/loopback (online)
|
||||
|
||||
- Configuration of startup options is by way of SMF properties in a
|
||||
property group named 'quagga'. The defaults should automatically be
|
||||
inline with how you configured Quagga in Step 1 above.
|
||||
property group named 'frr'. The defaults should automatically be
|
||||
inline with how you configured FreeRangeRouting in Step 1 above.
|
||||
|
||||
- By default the VTY interface is disabled. To change this, see below for
|
||||
how to set the 'quagga/vty_port' property as appropriate for
|
||||
how to set the 'frr/vty_port' property as appropriate for
|
||||
/each/ service. Also, the VTY is set to listen only to localhost by
|
||||
default, you may change the 'quagga/vty_addr' property as appropriate
|
||||
for both of the 'quagga' service and specific individual instances of
|
||||
the 'quagga' service (ie quagga:zebra, quagga:ospfd, etc..).
|
||||
default, you may change the 'frr/vty_addr' property as appropriate
|
||||
for both of the 'frr' service and specific individual instances of
|
||||
the 'frr' service (ie frr:zebra, frr:ospfd, etc..).
|
||||
|
||||
- Properties belonging to the 'quagga' service are inherited by all
|
||||
- Properties belonging to the 'frr' service are inherited by all
|
||||
instances. Eg:
|
||||
|
||||
# svcprop -p quagga svc:/network/routing/quagga
|
||||
quagga/group astring root
|
||||
quagga/retain boolean false
|
||||
quagga/user astring root
|
||||
quagga/vty_addr astring 127.1
|
||||
quagga/vty_port integer 0
|
||||
# svcprop -p frr svc:/network/routing/frr
|
||||
frr/group astring root
|
||||
frr/retain boolean false
|
||||
frr/user astring root
|
||||
frr/vty_addr astring 127.1
|
||||
frr/vty_port integer 0
|
||||
|
||||
# svcprop -p quagga svc:/network/routing/quagga:ospfd
|
||||
quagga/retain_routes boolean false
|
||||
quagga/group astring root
|
||||
quagga/retain boolean false
|
||||
quagga/user astring root
|
||||
quagga/vty_addr astring 127.1
|
||||
quagga/vty_port integer 0
|
||||
# svcprop -p frr svc:/network/routing/frr:ospfd
|
||||
frr/retain_routes boolean false
|
||||
frr/group astring root
|
||||
frr/retain boolean false
|
||||
frr/user astring root
|
||||
frr/vty_addr astring 127.1
|
||||
frr/vty_port integer 0
|
||||
|
||||
All instances will inherit these properties, unless the instance itself
|
||||
overrides these defaults. This also implies one can modify properties of
|
||||
the 'quagga' service and have them apply to all daemons.
|
||||
the 'frr' service and have them apply to all daemons.
|
||||
|
||||
# svccfg -s svc:/network/routing/quagga \
|
||||
setprop quagga/vty_addr = astring: ::1
|
||||
# svccfg -s svc:/network/routing/frr \
|
||||
setprop frr/vty_addr = astring: ::1
|
||||
|
||||
# svcprop -p quagga svc:/network/routing/quagga
|
||||
quagga/group astring root
|
||||
quagga/retain boolean false
|
||||
quagga/user astring root
|
||||
quagga/vty_port integer 0
|
||||
quagga/vty_addr astring ::1
|
||||
# svcprop -p frr svc:/network/routing/frr
|
||||
frr/group astring root
|
||||
frr/retain boolean false
|
||||
frr/user astring root
|
||||
frr/vty_port integer 0
|
||||
frr/vty_addr astring ::1
|
||||
|
||||
# # You *must* refresh instances to have the property change
|
||||
# # take affect for the 'running snapshot' of service state.
|
||||
# svcadm refresh quagga:ospfd
|
||||
# svcadm refresh frr:ospfd
|
||||
|
||||
# svcprop -p quagga svc:/network/routing/quagga:ospfd
|
||||
quagga/retain_routes boolean false
|
||||
quagga/group astring root
|
||||
quagga/retain boolean false
|
||||
quagga/user astring root
|
||||
quagga/vty_port integer 0
|
||||
quagga/vty_addr astring ::1
|
||||
# svcprop -p frr svc:/network/routing/frr:ospfd
|
||||
frr/retain_routes boolean false
|
||||
frr/group astring root
|
||||
frr/retain boolean false
|
||||
frr/user astring root
|
||||
frr/vty_port integer 0
|
||||
frr/vty_addr astring ::1
|
||||
|
||||
Other daemon-specific options/properties may be available, however they
|
||||
are not yet honoured/used (eg ospfd/apiserver on svc:/network/ospf).
|
||||
@ -177,12 +176,11 @@ Install and post-install configuration notes:
|
||||
- As SMF is dependency aware, restarting network/zebra will restart all the
|
||||
other daemons.
|
||||
|
||||
- To upgrade from one set of Quagga packages to a newer release, one must
|
||||
first pkgrm the installed packages. When one pkgrm's QUAGGAsmf all
|
||||
- To upgrade from one set of FreeRangeRouting packages to a newer release,
|
||||
one must first pkgrm the installed packages. When one pkgrm's FRRsmf all
|
||||
property configuration will be lost, and any customisations will have to
|
||||
redone after installing the updated QUAGGAsmf package.
|
||||
redone after installing the updated FRRsmf package.
|
||||
|
||||
- These packages are not supported by Sun Microsystems, report bugs via the
|
||||
usual Quagga channels, ie Bugzilla. Improvements/contributions of course
|
||||
would be greatly appreciated.
|
||||
usual FreeRangeRouting channels, ie Issue Tracker. Improvements/contributions of course would be greatly appreciated.
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
P QUAGGAlibs Quagga common runtime libraries
|
||||
P FRRlibs FreeRangeRouting common runtime libraries
|
||||
@PACKAGE_VERSION@,REV=@CONFDATE@
|
||||
P SUNWcsu Core Solaris, (Usr)
|
||||
P SUNWcsr Core Solaris Libraries (Root)
|
||||
|
@ -1,2 +1,2 @@
|
||||
P QUAGGAlibs Quagga common runtime libraries
|
||||
P FRRlibs FreeRangeRouting common runtime libraries
|
||||
@PACKAGE_VERSION@,REV=@CONFDATE@
|
||||
|
@ -1,5 +1,5 @@
|
||||
P SUNWcslr Core Solaris Libraries (Root)
|
||||
P SUNWcsl Core Solaris, (Shared Libs)
|
||||
P SUNWlibmsr Math & Microtasking Libraries (Root)
|
||||
R QUAGGAdaemons Quagga daemons
|
||||
R QUAGGAdev
|
||||
R FRRdaemons FreeRangeRouting daemons
|
||||
R FRRdev
|
||||
|
@ -1,4 +1,4 @@
|
||||
P QUAGGAdaemons Quagga daemons
|
||||
P FRRaemons FreeRangeRouting daemons
|
||||
@PACKAGE_VERSION@,REV=@CONFDATE@
|
||||
P SUNWcsu Core Solaris, (Usr)
|
||||
P SUNWcsr Core Solaris Libraries (Root)
|
||||
|
@ -3,22 +3,22 @@
|
||||
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
# This file is part of Quagga.
|
||||
# This file is part of FreeRangeRouting.
|
||||
#
|
||||
# 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
|
||||
# FreeRangeRouting 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
|
||||
# FreeRangeRouting 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 Quagga; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
# 02111-1307, USA.
|
||||
# along with FreeRangeRouting; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# Starts/stops the given daemon
|
||||
|
||||
@ -74,36 +74,36 @@ handle_routeadm_upgrade () {
|
||||
|
||||
upgrade_config () {
|
||||
DAEMON=$1
|
||||
# handle upgrade of SUNWzebra to Quagga
|
||||
if [ -d "/etc/quagga" -a ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
|
||||
# handle upgrade of SUNWzebra to FreeRangeRouting
|
||||
if [ -d "/etc/frr" -a ! -f "/etc/frr/${DAEMON}.conf" ] ; then
|
||||
if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then
|
||||
cp "/etc/sfw/zebra/${DAEMON}.conf" \
|
||||
"/etc/quagga/${DAEMON}.conf.upgrade" \
|
||||
"/etc/frr/${DAEMON}.conf.upgrade" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.upgrade" \
|
||||
chown "${USER}:${GROUP}" "/etc/frr/${DAEMON}.conf.upgrade" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
chmod 0600 "/etc/quagga/${DAEMON}.conf.upgrade" \
|
||||
chmod 0600 "/etc/frr/${DAEMON}.conf.upgrade" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
mv "/etc/quagga/${DAEMON}.conf.upgrade" "/etc/quagga/${DAEMON}.conf" \
|
||||
mv "/etc/frr/${DAEMON}.conf.upgrade" "/etc/frr/${DAEMON}.conf" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
|
||||
touch "/etc/quagga/${DAEMON}.conf.new" \
|
||||
if [ ! -f "/etc/frr/${DAEMON}.conf" ] ; then
|
||||
touch "/etc/frr/${DAEMON}.conf.new" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.new" \
|
||||
chown "${USER}:${GROUP}" "/etc/frr/${DAEMON}.conf.new" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
chmod 0600 "/etc/quagga/${DAEMON}.conf.new" \
|
||||
chmod 0600 "/etc/frr/${DAEMON}.conf.new" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
mv "/etc/quagga/${DAEMON}.conf.new" "/etc/quagga/${DAEMON}.conf" \
|
||||
mv "/etc/frr/${DAEMON}.conf.new" "/etc/frr/${DAEMON}.conf" \
|
||||
|| exit $SMF_EXIT_ERR_FATAL
|
||||
fi
|
||||
}
|
||||
|
||||
# Relevant to S10+
|
||||
quagga_is_globalzone () {
|
||||
if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \
|
||||
frr_is_globalzone () {
|
||||
if [ "${FRR_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \
|
||||
-o `/sbin/zonename -t` = "exclusive" ]; then
|
||||
return 0
|
||||
else
|
||||
@ -188,9 +188,9 @@ case $1 in
|
||||
esac
|
||||
|
||||
if smf_present ; then
|
||||
QUAGGA_METHOD="start"
|
||||
FRR_METHOD="start"
|
||||
else
|
||||
QUAGGA_METHOD="$1"
|
||||
FRR_METHOD="$1"
|
||||
shift;
|
||||
fi
|
||||
|
||||
@ -208,7 +208,7 @@ case "${DAEMON}" in
|
||||
bgpd)
|
||||
;;
|
||||
zebra | ospfd | ospf6d | ripd | ripngd )
|
||||
quagga_is_globalzone || exit $SMF_EXIT_OK
|
||||
frr_is_globalzone || exit $SMF_EXIT_OK
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
@ -216,7 +216,7 @@ case "${DAEMON}" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Older Quagga SMF packages pass daemon args on the commandline
|
||||
# Older FreeRangeRouting SMF packages pass daemon args on the commandline
|
||||
# Newer SMF routeadm model uses properties for each argument
|
||||
# so we must handle that.
|
||||
if [ smf_present -a -f "$ROUTEADMINCLUDE" ]; then
|
||||
@ -236,14 +236,14 @@ if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then
|
||||
exit $SMF_EXIT_ERR_CONFIG
|
||||
fi
|
||||
|
||||
# we need @quagga_statedir@ to exist, it probably is on tmpfs.
|
||||
if [ ! -d @quagga_statedir@ ] ; then
|
||||
mkdir -p @quagga_statedir@
|
||||
chown @enable_user@:@enable_group@ @quagga_statedir@
|
||||
chmod 751 @quagga_statedir@
|
||||
# we need @frr_statedir@ to exist, it probably is on tmpfs.
|
||||
if [ ! -d @frr_statedir@ ] ; then
|
||||
mkdir -p @frr_statedir@
|
||||
chown @enable_user@:@enable_group@ @frr_statedir@
|
||||
chmod 751 @frr_statedir@
|
||||
fi
|
||||
|
||||
PIDFILE="@quagga_statedir@/${DAEMON}.pid"
|
||||
PIDFILE="@frr_statedir@/${DAEMON}.pid"
|
||||
|
||||
start () {
|
||||
if [ ! -x "$DAEMON_PATH/$DAEMON" ] ; then
|
||||
@ -259,7 +259,7 @@ stop_by_pidfile () {
|
||||
fi
|
||||
}
|
||||
|
||||
case "$QUAGGA_METHOD" in
|
||||
case "$FRR_METHOD" in
|
||||
'start')
|
||||
start
|
||||
;;
|
@ -1,32 +1,32 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
|
||||
<!--
|
||||
This file is part of Quagga.
|
||||
This file is part of FreeRangeRouting (FRR)
|
||||
|
||||
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.
|
||||
FreeRangeRouting 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) anylater version.
|
||||
|
||||
Quagga is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
FreeRangeRouting 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 Quagga; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
along with FreeRangeRouting; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA.
|
||||
|
||||
Copyright 2007 Sun Microsystems, Inc. All rights reserved.
|
||||
Use is subject to license terms.
|
||||
|
||||
Copyright 2015 Joyent, Inc.
|
||||
|
||||
ident "@(#)quagga.xml 1.0 05/03/15 SMI"
|
||||
ident "@(#)frr.xml 1.0 19/01/17 SMI"
|
||||
-->
|
||||
|
||||
<service_bundle type='manifest' name='SUNWquagga-daemons:quagga'>
|
||||
<service_bundle type='manifest' name='SUNWfrr-daemons:frr'>
|
||||
|
||||
<service
|
||||
name='network/routing/zebra'
|
||||
@ -34,7 +34,7 @@
|
||||
version='1'>
|
||||
|
||||
<single_instance />
|
||||
<instance name='quagga' enabled='false'>
|
||||
<instance name='frr' enabled='false'>
|
||||
|
||||
<dependency name='fs'
|
||||
grouping='require_all'
|
||||
@ -63,7 +63,7 @@
|
||||
<exec_method
|
||||
type='method'
|
||||
name='start'
|
||||
exec='/lib/svc/method/quagga zebra'
|
||||
exec='/lib/svc/method/frr zebra'
|
||||
timeout_seconds='60'>
|
||||
<method_context>
|
||||
<method_credential
|
||||
@ -107,9 +107,9 @@
|
||||
<propval name='value_authorization' type='astring'
|
||||
value='solaris.smf.value.routing' />
|
||||
|
||||
<!-- Options common to Quagga daemons
|
||||
<!-- Options common to FreeRangeRouting daemons
|
||||
Property names are equivalent to the long
|
||||
option name, consult Quagga documentation -->
|
||||
option name, consult FreeRangeRouting documentation -->
|
||||
<!-- The config file to use, if not the default -->
|
||||
<propval name='config_file' type='astring' value=''/>
|
||||
<!-- The vty_port to listen on if not the default.
|
||||
@ -124,7 +124,7 @@
|
||||
same name as user -->
|
||||
<propval name='group' type='astring' value='' />
|
||||
<!-- The pidfile to use, if not the default of
|
||||
@quagga_statedir@ -->
|
||||
@frr_statedir@ -->
|
||||
<propval name='pid_file' type='astring' value='' />
|
||||
|
||||
<!-- Options specific to zebra -->
|
||||
@ -142,14 +142,14 @@
|
||||
<template>
|
||||
<common_name>
|
||||
<loctext xml:lang='C'>
|
||||
Quagga: zebra, RIB, kernel intermediary and misc daemon
|
||||
FreeRangeRouting: zebra, RIB, kernel intermediary and misc daemon
|
||||
</loctext>
|
||||
</common_name>
|
||||
<documentation>
|
||||
<manpage title='zebra' section='1M'
|
||||
manpath='@mandir@' />
|
||||
<doc_link name='quagga.net'
|
||||
uri='http://www.quagga.net/' />
|
||||
<doc_link name='freerangerouting.org'
|
||||
uri='http://www.freerangerouting.org/' />
|
||||
</documentation>
|
||||
</template>
|
||||
</instance>
|
||||
@ -161,7 +161,7 @@
|
||||
type='service'
|
||||
version='1'>
|
||||
|
||||
<instance name='quagga' enabled='false'>
|
||||
<instance name='frr' enabled='false'>
|
||||
|
||||
<dependency name='fs'
|
||||
grouping='require_all'
|
||||
@ -194,13 +194,13 @@
|
||||
grouping='require_all'
|
||||
restart_on='restart'
|
||||
type='service'>
|
||||
<service_fmri value='svc:/network/routing/zebra:quagga' />
|
||||
<service_fmri value='svc:/network/routing/zebra:frr' />
|
||||
</dependency>
|
||||
|
||||
<exec_method
|
||||
type='method'
|
||||
name='start'
|
||||
exec='/lib/svc/method/quagga ripd'
|
||||
exec='/lib/svc/method/frr ripd'
|
||||
timeout_seconds='60'>
|
||||
<method_context>
|
||||
<method_credential
|
||||
@ -240,7 +240,7 @@
|
||||
<propval name='value_authorization' type='astring'
|
||||
value='solaris.smf.value.routing' />
|
||||
|
||||
<!-- Options common to Quagga daemons -->
|
||||
<!-- Options common to FreeRangeRouting daemons -->
|
||||
<!-- The config file to use, if not the default -->
|
||||
<propval name='config_file' type='astring' value=''/>
|
||||
<!-- The vty_port to listen on if not the default.
|
||||
@ -255,7 +255,7 @@
|
||||
same name as user -->
|
||||
<propval name='group' type='astring' value='' />
|
||||
<!-- The pidfile to use, if not the default of
|
||||
@quagga_statedir@ -->
|
||||
@frr_statedir@ -->
|
||||
<propval name='pid_file' type='astring' value='' />
|
||||
|
||||
<!-- Options specific to ripd -->
|
||||
@ -273,14 +273,14 @@
|
||||
<template>
|
||||
<common_name>
|
||||
<loctext xml:lang='C'>
|
||||
Quagga: ripd, RIPv1/2 IPv4 routing protocol daemon.
|
||||
FreeRangeRouting: ripd, RIPv1/2 IPv4 routing protocol daemon.
|
||||
</loctext>
|
||||
</common_name>
|
||||
<documentation>
|
||||
<manpage title='ripd' section='1M'
|
||||
manpath='@mandir@' />
|
||||
<doc_link name='quagga.net'
|
||||
uri='http://www.quagga.net/' />
|
||||
<doc_link name='freerangerouting.org'
|
||||
uri='http://www.freerangerouting.org/' />
|
||||
</documentation>
|
||||
</template>
|
||||
</instance>
|
||||
@ -292,7 +292,7 @@
|
||||
type='service'
|
||||
version='1'>
|
||||
|
||||
<instance name='quagga' enabled='false'>
|
||||
<instance name='frr' enabled='false'>
|
||||
|
||||
<dependency name='fs'
|
||||
grouping='require_all'
|
||||
@ -325,13 +325,13 @@
|
||||
grouping='require_all'
|
||||
restart_on='restart'
|
||||
type='service'>
|
||||
<service_fmri value='svc:/network/routing/zebra:quagga' />
|
||||
<service_fmri value='svc:/network/routing/zebra:frr' />
|
||||
</dependency>
|
||||
|
||||
<exec_method
|
||||
type='method'
|
||||
name='start'
|
||||
exec='/lib/svc/method/quagga ripngd'
|
||||
exec='/lib/svc/method/frr ripngd'
|
||||
timeout_seconds='60'>
|
||||
<method_context>
|
||||
<method_credential
|
||||
@ -369,7 +369,7 @@
|
||||
<propval name='value_authorization' type='astring'
|
||||
value='solaris.smf.value.routing' />
|
||||
|
||||
<!-- Options common to Quagga daemons -->
|
||||
<!-- Options common to frr daemons -->
|
||||
<!-- The config file to use, if not the default -->
|
||||
<propval name='config_file' type='astring' value=''/>
|
||||
<!-- The vty_port to listen on if not the default.
|
||||
@ -384,7 +384,7 @@
|
||||
same name as user -->
|
||||
<propval name='group' type='astring' value='' />
|
||||
<!-- The pidfile to use, if not the default of
|
||||
@quagga_statedir@ -->
|
||||
@frr_statedir@ -->
|
||||
<propval name='pid_file' type='astring' value='' />
|
||||
|
||||
<!-- Options specific to ripngd -->
|
||||
@ -402,14 +402,14 @@
|
||||
<template>
|
||||
<common_name>
|
||||
<loctext xml:lang='C'>
|
||||
Quagga: ripngd, RIPng IPv6 routing protocol daemon.
|
||||
frr: ripngd, RIPng IPv6 routing protocol daemon.
|
||||
</loctext>
|
||||
</common_name>
|
||||
<documentation>
|
||||
<manpage title='ripngd' section='1M'
|
||||
manpath='@mandir@' />
|
||||
<doc_link name='quagga.net'
|
||||
uri='http://www.quagga.net/' />
|
||||
<doc_link name='freerangerouting.org'
|
||||
uri='http://www.freerangerouting.org/' />
|
||||
</documentation>
|
||||
</template>
|
||||
</instance>
|
||||
@ -421,7 +421,7 @@
|
||||
type='service'
|
||||
version='1'>
|
||||
|
||||
<instance name='quagga' enabled='false'>
|
||||
<instance name='frr' enabled='false'>
|
||||
|
||||
<dependency name='fs'
|
||||
grouping='require_all'
|
||||
@ -454,13 +454,13 @@
|
||||
grouping='require_all'
|
||||
restart_on='restart'
|
||||
type='service'>
|
||||
<service_fmri value='svc:/network/routing/zebra:quagga' />
|
||||
<service_fmri value='svc:/network/routing/zebra:frr' />
|
||||
</dependency>
|
||||
|
||||
<exec_method
|
||||
type='method'
|
||||
name='start'
|
||||
exec='/lib/svc/method/quagga ospfd'
|
||||
exec='/lib/svc/method/frr ospfd'
|
||||
timeout_seconds='60'>
|
||||
<method_context>
|
||||
<method_credential
|
||||
@ -503,7 +503,7 @@
|
||||
<propval name='value_authorization' type='astring'
|
||||
value='solaris.smf.value.routing' />
|
||||
|
||||
<!-- Options common to Quagga daemons -->
|
||||
<!-- Options common to frr daemons -->
|
||||
<!-- The config file to use, if not the default -->
|
||||
<propval name='config_file' type='astring' value=''/>
|
||||
<!-- The vty_port to listen on if not the default.
|
||||
@ -518,7 +518,7 @@
|
||||
same name as user -->
|
||||
<propval name='group' type='astring' value='' />
|
||||
<!-- The pidfile to use, if not the default of
|
||||
@quagga_statedir@ -->
|
||||
@frr_statedir@ -->
|
||||
<propval name='pid_file' type='astring' value='' />
|
||||
</property_group>
|
||||
|
||||
@ -533,14 +533,14 @@
|
||||
<template>
|
||||
<common_name>
|
||||
<loctext xml:lang='C'>
|
||||
Quagga: ospfd, OSPFv2 IPv4 routing protocol daemon.
|
||||
frr: ospfd, OSPFv2 IPv4 routing protocol daemon.
|
||||
</loctext>
|
||||
</common_name>
|
||||
<documentation>
|
||||
<manpage title='ospfd' section='1M'
|
||||
manpath='@mandir@' />
|
||||
<doc_link name='quagga.net'
|
||||
uri='http://www.quagga.net/' />
|
||||
<doc_link name='freerangerouting.org'
|
||||
uri='http://www.freerangerouting.org/' />
|
||||
</documentation>
|
||||
</template>
|
||||
</instance>
|
||||
@ -552,7 +552,7 @@
|
||||
type='service'
|
||||
version='1'>
|
||||
|
||||
<instance name='quagga' enabled='false'>
|
||||
<instance name='frr' enabled='false'>
|
||||
|
||||
<dependency name='fs'
|
||||
grouping='require_all'
|
||||
@ -585,13 +585,13 @@
|
||||
grouping='require_all'
|
||||
restart_on='restart'
|
||||
type='service'>
|
||||
<service_fmri value='svc:/network/routing/zebra:quagga' />
|
||||
<service_fmri value='svc:/network/routing/zebra:frr' />
|
||||
</dependency>
|
||||
|
||||
<exec_method
|
||||
type='method'
|
||||
name='start'
|
||||
exec='/lib/svc/method/quagga ospf6d'
|
||||
exec='/lib/svc/method/frr ospf6d'
|
||||
timeout_seconds='60'>
|
||||
<method_context>
|
||||
<method_credential
|
||||
@ -629,7 +629,7 @@
|
||||
<propval name='value_authorization' type='astring'
|
||||
value='solaris.smf.value.routing' />
|
||||
|
||||
<!-- Options common to Quagga daemons -->
|
||||
<!-- Options common to frr daemons -->
|
||||
<!-- The config file to use, if not the default -->
|
||||
<propval name='config_file' type='astring' value=''/>
|
||||
<!-- The vty_port to listen on if not the default.
|
||||
@ -644,7 +644,7 @@
|
||||
same name as user -->
|
||||
<propval name='group' type='astring' value='' />
|
||||
<!-- The pidfile to use, if not the default of
|
||||
@quagga_statedir@ -->
|
||||
@frr_statedir@ -->
|
||||
<propval name='pid_file' type='astring' value='' />
|
||||
</property_group>
|
||||
|
||||
@ -659,14 +659,14 @@
|
||||
<template>
|
||||
<common_name>
|
||||
<loctext xml:lang='C'>
|
||||
Quagga: ospf6d, OSPFv3 IPv6 routing protocol daemon.
|
||||
frr: ospf6d, OSPFv3 IPv6 routing protocol daemon.
|
||||
</loctext>
|
||||
</common_name>
|
||||
<documentation>
|
||||
<manpage title='ospf6d' section='1M'
|
||||
manpath='@mandir@' />
|
||||
<doc_link name='quagga.net'
|
||||
uri='http://www.quagga.net/' />
|
||||
<doc_link name='freerangerouting.org'
|
||||
uri='http://www.freerangerouting.org/' />
|
||||
</documentation>
|
||||
</template>
|
||||
</instance>
|
||||
@ -679,7 +679,7 @@
|
||||
type='service'
|
||||
version='1'>
|
||||
|
||||
<instance name='quagga' enabled='false'>
|
||||
<instance name='frr' enabled='false'>
|
||||
|
||||
<dependency name='fs'
|
||||
grouping='require_all'
|
||||
@ -720,13 +720,13 @@
|
||||
grouping='require_all'
|
||||
restart_on='restart'
|
||||
type='service'>
|
||||
<service_fmri value='svc:/network/routing/zebra:quagga' />
|
||||
<service_fmri value='svc:/network/routing/zebra:frr' />
|
||||
</dependency>
|
||||
|
||||
<exec_method
|
||||
type='method'
|
||||
name='start'
|
||||
exec='/lib/svc/method/quagga bgpd'
|
||||
exec='/lib/svc/method/frr bgpd'
|
||||
timeout_seconds='60'>
|
||||
<method_context>
|
||||
<method_credential
|
||||
@ -771,7 +771,7 @@
|
||||
<propval name='value_authorization' type='astring'
|
||||
value='solaris.smf.value.routing' />
|
||||
|
||||
<!-- Options common to Quagga daemons. -->
|
||||
<!-- Options common to frr daemons. -->
|
||||
<!-- The config file to use, if not the default -->
|
||||
<propval name='config_file' type='astring' value=''/>
|
||||
<!-- The vty_port to listen on if not the default.
|
||||
@ -786,7 +786,7 @@
|
||||
same name as user -->
|
||||
<propval name='group' type='astring' value='' />
|
||||
<!-- The pidfile to use, if not the default of
|
||||
@quagga_statedir@ -->
|
||||
@frr_statedir@ -->
|
||||
<propval name='pid_file' type='astring' value='' />
|
||||
|
||||
<!-- Options specific to bgpd -->
|
||||
@ -812,14 +812,14 @@
|
||||
<template>
|
||||
<common_name>
|
||||
<loctext xml:lang='C'>
|
||||
Quagga: bgpd, BGP routing protocol daemon.
|
||||
frr: bgpd, BGP routing protocol daemon.
|
||||
</loctext>
|
||||
</common_name>
|
||||
<documentation>
|
||||
<manpage title='bgpd' section='1M'
|
||||
manpath='@mandir@' />
|
||||
<doc_link name='quagga.net'
|
||||
uri='http://www.quagga.net/' />
|
||||
<doc_link name='freerangerouting.org'
|
||||
uri='http://www.freerangerouting.org/' />
|
||||
</documentation>
|
||||
</template>
|
||||
</instance>
|
@ -1,2 +1,2 @@
|
||||
PKG="QUAGGAdaemons"
|
||||
PKG="FRRdaemons"
|
||||
NAME="@PACKAGE_NAME@ - @PACKAGE_NAME@ daemons"
|
||||
|
@ -1,3 +1,3 @@
|
||||
PKG=QUAGGAdev
|
||||
PKG=FRRdev
|
||||
NAME="@PACKAGE_NAME@ - @PACKAGE_NAME@ development files"
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
PKG=QUAGGAdoc
|
||||
PKG=FRRdoc
|
||||
NAME="@PACKAGE_NAME@ - @PACKAGE_NAME@ documentation"
|
||||
|
@ -1,2 +1,2 @@
|
||||
PKG=QUAGGAlibs
|
||||
PKG=FRRlibs
|
||||
NAME="@PACKAGE_NAME@ - @PACKAGE_NAME@ common runtime libraries"
|
||||
|
@ -1,2 +1,2 @@
|
||||
PKG="QUAGGAsmf"
|
||||
PKG="FRRsmf"
|
||||
NAME="@PACKAGE_NAME@ - @PACKAGE_NAME@ SMF support"
|
||||
|
@ -1,9 +1,9 @@
|
||||
ARCH="@target_cpu@"
|
||||
CATEGORY="system"
|
||||
VERSION="@PACKAGE_VERSION@,REV=@CONFDATE@"
|
||||
VENDOR="http://www.quagga.net/"
|
||||
VENDOR="http://www.freerangerouting.org/"
|
||||
HOTLINE="@PACKAGE_BUGREPORT@"
|
||||
EMAIL=paul@quagga.net
|
||||
EMAIL=maintainers@freerangerouting.org
|
||||
DESC="@PACKAGE_NAME@ Routing Protocols"
|
||||
MAXINST=1
|
||||
CLASSES="none preserve renamenew manifest"
|
||||
|
@ -17,4 +17,4 @@ f none @sysconfdir@/ripd.conf.sample=$DESTDIR/@sysconfdir@/ripd.conf.sample 0644
|
||||
f none @sysconfdir@/ripngd.conf.sample=$DESTDIR/@sysconfdir@/ripngd.conf.sample 0644 root bin
|
||||
f none @sysconfdir@/ospfd.conf.sample=$DESTDIR/@sysconfdir@/ospfd.conf.sample 0644 root bin
|
||||
f none @sysconfdir@/ospf6d.conf.sample=$DESTDIR/@sysconfdir@/ospf6d.conf.sample 0644 root bin
|
||||
d none @quagga_statedir@=$DESTDIR/@quagga_statedir@ 0711 @enable_user@ @enable_group@
|
||||
d none @frr_statedir@=$DESTDIR/@frr_statedir@ 0711 @enable_user@ @enable_group@
|
||||
|
@ -8,50 +8,50 @@ f none @libdir@/libospf.a=$DESTDIR/@libdir@/libospf.a 0644 root bin
|
||||
f none @libdir@/libospfapiclient.la=$DESTDIR/@libdir@/libospfapiclient.la 0755 root bin
|
||||
f none @libdir@/libospfapiclient.a=$DESTDIR/@libdir@/libospfapiclient.a 0644 root bin
|
||||
d none @includedir@=$DESTDIR/@includedir@ 0755 root bin
|
||||
d none @includedir@/quagga=$DESTDIR/@includedir@/quagga 0755 root bin
|
||||
d none @includedir@/quagga/ospfd=$DESTDIR/@includedir@/quagga/ospfd 0755 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_api.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_api.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_asbr.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_asbr.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_dump.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_dump.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_lsa.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_lsa.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_lsdb.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_lsdb.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_nsm.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_nsm.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_ism.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_ism.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospf_opaque.h=$DESTDIR/@includedir@/quagga/ospfd/ospf_opaque.h 0644 root bin
|
||||
f none @includedir@/quagga/ospfd/ospfd.h=$DESTDIR/@includedir@/quagga/ospfd/ospfd.h 0644 root bin
|
||||
f none @includedir@/quagga/buffer.h=$DESTDIR/@includedir@/quagga/buffer.h 0644 root bin
|
||||
f none @includedir@/quagga/command.h=$DESTDIR/@includedir@/quagga/command.h 0644 root bin
|
||||
f none @includedir@/quagga/filter.h=$DESTDIR/@includedir@/quagga/filter.h 0644 root bin
|
||||
f none @includedir@/quagga/getopt.h=$DESTDIR/@includedir@/quagga/getopt.h 0644 root bin
|
||||
f none @includedir@/quagga/hash.h=$DESTDIR/@includedir@/quagga/hash.h 0644 root bin
|
||||
f none @includedir@/quagga/if.h=$DESTDIR/@includedir@/quagga/if.h 0644 root bin
|
||||
f none @includedir@/quagga/linklist.h=$DESTDIR/@includedir@/quagga/linklist.h 0644 root bin
|
||||
f none @includedir@/quagga/log.h=$DESTDIR/@includedir@/quagga/log.h 0644 root bin
|
||||
f none @includedir@/quagga/memory.h=$DESTDIR/@includedir@/quagga/memory.h 0644 root bin
|
||||
f none @includedir@/quagga/network.h=$DESTDIR/@includedir@/quagga/network.h 0644 root bin
|
||||
f none @includedir@/quagga/prefix.h=$DESTDIR/@includedir@/quagga/prefix.h 0644 root bin
|
||||
f none @includedir@/quagga/routemap.h=$DESTDIR/@includedir@/quagga/routemap.h 0644 root bin
|
||||
f none @includedir@/quagga/distribute.h=$DESTDIR/@includedir@/quagga/distribute.h 0644 root bin
|
||||
f none @includedir@/quagga/sockunion.h=$DESTDIR/@includedir@/quagga/sockunion.h 0644 root bin
|
||||
f none @includedir@/quagga/str.h=$DESTDIR/@includedir@/quagga/str.h 0644 root bin
|
||||
f none @includedir@/quagga/stream.h=$DESTDIR/@includedir@/quagga/stream.h 0644 root bin
|
||||
f none @includedir@/quagga/table.h=$DESTDIR/@includedir@/quagga/table.h 0644 root bin
|
||||
f none @includedir@/quagga/thread.h=$DESTDIR/@includedir@/quagga/thread.h 0644 root bin
|
||||
f none @includedir@/quagga/vector.h=$DESTDIR/@includedir@/quagga/vector.h 0644 root bin
|
||||
f none @includedir@/quagga/version.h=$DESTDIR/@includedir@/quagga/version.h 0644 root bin
|
||||
f none @includedir@/quagga/vty.h=$DESTDIR/@includedir@/quagga/vty.h 0644 root bin
|
||||
f none @includedir@/quagga/zebra.h=$DESTDIR/@includedir@/quagga/zebra.h 0644 root bin
|
||||
f none @includedir@/quagga/plist.h=$DESTDIR/@includedir@/quagga/plist.h 0644 root bin
|
||||
f none @includedir@/quagga/zclient.h=$DESTDIR/@includedir@/quagga/zclient.h 0644 root bin
|
||||
f none @includedir@/quagga/sockopt.h=$DESTDIR/@includedir@/quagga/sockopt.h 0644 root bin
|
||||
f none @includedir@/quagga/smux.h=$DESTDIR/@includedir@/quagga/smux.h 0644 root bin
|
||||
f none @includedir@/quagga/md5.h=$DESTDIR/@includedir@/quagga/md5.h 0644 root bin
|
||||
f none @includedir@/quagga/if_rmap.h=$DESTDIR/@includedir@/quagga/if_rmap.h 0644 root bin
|
||||
f none @includedir@/quagga/keychain.h=$DESTDIR/@includedir@/quagga/keychain.h 0644 root bin
|
||||
f none @includedir@/quagga/privs.h=$DESTDIR/@includedir@/quagga/privs.h 0644 root bin
|
||||
f none @includedir@/quagga/sigevent.h=$DESTDIR/@includedir@/quagga/sigevent.h 0644 root bin
|
||||
f none @includedir@/quagga/pqueue.h=$DESTDIR/@includedir@/quagga/pqueue.h 0644 root bin
|
||||
f none @includedir@/quagga/jhash.h=$DESTDIR/@includedir@/quagga/jhash.h 0644 root bin
|
||||
f none @includedir@/quagga/zassert.h=$DESTDIR/@includedir@/quagga/zassert.h 0644 root bin
|
||||
d none @includedir@/quagga/ospfapi=$DESTDIR/@includedir@/quagga/ospfapi 0755 root bin
|
||||
f none @includedir@/quagga/ospfapi/ospf_apiclient.h=$DESTDIR/@includedir@/quagga/ospfapi/ospf_apiclient.h 0644 root bin
|
||||
d none @includedir@/frr=$DESTDIR/@includedir@/frr 0755 root bin
|
||||
d none @includedir@/frr/ospfd=$DESTDIR/@includedir@/frr/ospfd 0755 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_api.h=$DESTDIR/@includedir@/frr/ospfd/ospf_api.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_asbr.h=$DESTDIR/@includedir@/frr/ospfd/ospf_asbr.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_dump.h=$DESTDIR/@includedir@/frr/ospfd/ospf_dump.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_lsa.h=$DESTDIR/@includedir@/frr/ospfd/ospf_lsa.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_lsdb.h=$DESTDIR/@includedir@/frr/ospfd/ospf_lsdb.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_nsm.h=$DESTDIR/@includedir@/frr/ospfd/ospf_nsm.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_ism.h=$DESTDIR/@includedir@/frr/ospfd/ospf_ism.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospf_opaque.h=$DESTDIR/@includedir@/frr/ospfd/ospf_opaque.h 0644 root bin
|
||||
f none @includedir@/frr/ospfd/ospfd.h=$DESTDIR/@includedir@/frr/ospfd/ospfd.h 0644 root bin
|
||||
f none @includedir@/frr/buffer.h=$DESTDIR/@includedir@/frr/buffer.h 0644 root bin
|
||||
f none @includedir@/frr/command.h=$DESTDIR/@includedir@/frr/command.h 0644 root bin
|
||||
f none @includedir@/frr/filter.h=$DESTDIR/@includedir@/frr/filter.h 0644 root bin
|
||||
f none @includedir@/frr/getopt.h=$DESTDIR/@includedir@/frr/getopt.h 0644 root bin
|
||||
f none @includedir@/frr/hash.h=$DESTDIR/@includedir@/frr/hash.h 0644 root bin
|
||||
f none @includedir@/frr/if.h=$DESTDIR/@includedir@/frr/if.h 0644 root bin
|
||||
f none @includedir@/frr/linklist.h=$DESTDIR/@includedir@/frr/linklist.h 0644 root bin
|
||||
f none @includedir@/frr/log.h=$DESTDIR/@includedir@/frr/log.h 0644 root bin
|
||||
f none @includedir@/frr/memory.h=$DESTDIR/@includedir@/frr/memory.h 0644 root bin
|
||||
f none @includedir@/frr/network.h=$DESTDIR/@includedir@/frr/network.h 0644 root bin
|
||||
f none @includedir@/frr/prefix.h=$DESTDIR/@includedir@/frr/prefix.h 0644 root bin
|
||||
f none @includedir@/frr/routemap.h=$DESTDIR/@includedir@/frr/routemap.h 0644 root bin
|
||||
f none @includedir@/frr/distribute.h=$DESTDIR/@includedir@/frr/distribute.h 0644 root bin
|
||||
f none @includedir@/frr/sockunion.h=$DESTDIR/@includedir@/frr/sockunion.h 0644 root bin
|
||||
f none @includedir@/frr/str.h=$DESTDIR/@includedir@/frr/str.h 0644 root bin
|
||||
f none @includedir@/frr/stream.h=$DESTDIR/@includedir@/frr/stream.h 0644 root bin
|
||||
f none @includedir@/frr/table.h=$DESTDIR/@includedir@/frr/table.h 0644 root bin
|
||||
f none @includedir@/frr/thread.h=$DESTDIR/@includedir@/frr/thread.h 0644 root bin
|
||||
f none @includedir@/frr/vector.h=$DESTDIR/@includedir@/frr/vector.h 0644 root bin
|
||||
f none @includedir@/frr/version.h=$DESTDIR/@includedir@/frr/version.h 0644 root bin
|
||||
f none @includedir@/frr/vty.h=$DESTDIR/@includedir@/frr/vty.h 0644 root bin
|
||||
f none @includedir@/frr/zebra.h=$DESTDIR/@includedir@/frr/zebra.h 0644 root bin
|
||||
f none @includedir@/frr/plist.h=$DESTDIR/@includedir@/frr/plist.h 0644 root bin
|
||||
f none @includedir@/frr/zclient.h=$DESTDIR/@includedir@/frr/zclient.h 0644 root bin
|
||||
f none @includedir@/frr/sockopt.h=$DESTDIR/@includedir@/frr/sockopt.h 0644 root bin
|
||||
f none @includedir@/frr/smux.h=$DESTDIR/@includedir@/frr/smux.h 0644 root bin
|
||||
f none @includedir@/frr/md5.h=$DESTDIR/@includedir@/frr/md5.h 0644 root bin
|
||||
f none @includedir@/frr/if_rmap.h=$DESTDIR/@includedir@/frr/if_rmap.h 0644 root bin
|
||||
f none @includedir@/frr/keychain.h=$DESTDIR/@includedir@/frr/keychain.h 0644 root bin
|
||||
f none @includedir@/frr/privs.h=$DESTDIR/@includedir@/frr/privs.h 0644 root bin
|
||||
f none @includedir@/frr/sigevent.h=$DESTDIR/@includedir@/frr/sigevent.h 0644 root bin
|
||||
f none @includedir@/frr/pqueue.h=$DESTDIR/@includedir@/frr/pqueue.h 0644 root bin
|
||||
f none @includedir@/frr/jhash.h=$DESTDIR/@includedir@/frr/jhash.h 0644 root bin
|
||||
f none @includedir@/frr/zassert.h=$DESTDIR/@includedir@/frr/zassert.h 0644 root bin
|
||||
d none @includedir@/frr/ospfapi=$DESTDIR/@includedir@/frr/ospfapi 0755 root bin
|
||||
f none @includedir@/frr/ospfapi/ospf_apiclient.h=$DESTDIR/@includedir@/frr/ospfapi/ospf_apiclient.h 0644 root bin
|
||||
|
@ -3,7 +3,7 @@ i depend=$abs_builddir/depend.doc
|
||||
i copying=$abs_top_srcdir/COPYING
|
||||
d none @infodir@=$DESTDIR/@infodir@ 0755 root bin
|
||||
#f none @infodir@/dir=$DESTDIR/@infodir@/dir 0644 root bin
|
||||
f none @infodir@/quagga.info=$DESTDIR/@infodir@/quagga.info 0644 root bin
|
||||
f none @infodir@/frr.info=$DESTDIR/@infodir@/frr.info 0644 root bin
|
||||
d none @mandir@=$DESTDIR/@mandir@ 0755 root bin
|
||||
d none @mandir@/man1=$DESTDIR/@mandir@/man1 0755 root bin
|
||||
f none @mandir@/man1/vtysh.1=$DESTDIR/@mandir@/man1/vtysh.1 0644 root bin
|
||||
|
@ -3,6 +3,6 @@ i depend=$abs_builddir/depend.smf
|
||||
i copying=$abs_top_srcdir/COPYING
|
||||
i i.manifest
|
||||
i r.manifest
|
||||
f manifest var/svc/manifest/network/quagga.xml 0444 root bin
|
||||
f manifest var/svc/manifest/network/frr.xml 0444 root bin
|
||||
#f none var/svc/profile/@PACKAGE_TARNAME@_options.xml=$abs_builddir/options.xml 0755 root sys
|
||||
f none lib/svc/method/quagga=$abs_builddir/quagga.init 0755 root bin
|
||||
f none lib/svc/method/frr=$abs_builddir/frr.init 0755 root bin
|
||||
|
@ -38,7 +38,7 @@ import string
|
||||
import subprocess
|
||||
import sys
|
||||
from collections import OrderedDict
|
||||
from ipaddr import IPv6Address
|
||||
from ipaddr import IPv6Address, IPNetwork
|
||||
from pprint import pformat
|
||||
|
||||
|
||||
@ -173,6 +173,100 @@ class Config(object):
|
||||
if not key:
|
||||
return
|
||||
|
||||
'''
|
||||
IP addresses specified in "network" statements, "ip prefix-lists"
|
||||
etc. can differ in the host part of the specification the user
|
||||
provides and what the running config displays. For example, user
|
||||
can specify 11.1.1.1/24, and the running config displays this as
|
||||
11.1.1.0/24. Ensure we don't do a needless operation for such
|
||||
lines. IS-IS & OSPFv3 have no "network" support.
|
||||
'''
|
||||
re_key_rt = re.match(r'(ip|ipv6)\s+route\s+([A-Fa-f:.0-9/]+)(.*)$', key[0])
|
||||
if re_key_rt:
|
||||
addr = re_key_rt.group(2)
|
||||
if '/' in addr:
|
||||
try:
|
||||
newaddr = IPNetwork(addr)
|
||||
key[0] = '%s route %s/%s%s' % (re_key_rt.group(1),
|
||||
newaddr.network,
|
||||
newaddr.prefixlen,
|
||||
re_key_rt.group(3))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
re_key_rt = re.match(
|
||||
r'(ip|ipv6)\s+prefix-list(.*)(permit|deny)\s+([A-Fa-f:.0-9/]+)(.*)$',
|
||||
key[0]
|
||||
)
|
||||
if re_key_rt:
|
||||
addr = re_key_rt.group(4)
|
||||
if '/' in addr:
|
||||
try:
|
||||
newaddr = '%s/%s' % (IPNetwork(addr).network,
|
||||
IPNetwork(addr).prefixlen)
|
||||
except ValueError:
|
||||
newaddr = addr
|
||||
else:
|
||||
newaddr = addr
|
||||
|
||||
legestr = re_key_rt.group(5)
|
||||
re_lege = re.search(r'(.*)le\s+(\d+)\s+ge\s+(\d+)(.*)', legestr)
|
||||
if re_lege:
|
||||
legestr = '%sge %s le %s%s' % (re_lege.group(1),
|
||||
re_lege.group(3),
|
||||
re_lege.group(2),
|
||||
re_lege.group(4))
|
||||
re_lege = re.search(r'(.*)ge\s+(\d+)\s+le\s+(\d+)(.*)', legestr)
|
||||
|
||||
if (re_lege and ((re_key_rt.group(1) == "ip" and
|
||||
re_lege.group(3) == "32") or
|
||||
(re_key_rt.group(1) == "ipv6" and
|
||||
re_lege.group(3) == "128"))):
|
||||
legestr = '%sge %s%s' % (re_lege.group(1),
|
||||
re_lege.group(2),
|
||||
re_lege.group(4))
|
||||
|
||||
key[0] = '%s prefix-list%s%s %s%s' % (re_key_rt.group(1),
|
||||
re_key_rt.group(2),
|
||||
re_key_rt.group(3),
|
||||
newaddr,
|
||||
legestr)
|
||||
|
||||
if lines and key[0].startswith('router bgp'):
|
||||
newlines = []
|
||||
for line in lines:
|
||||
re_net = re.match(r'network\s+([A-Fa-f:.0-9/]+)(.*)$', line)
|
||||
if re_net:
|
||||
addr = re_net.group(1)
|
||||
if '/' not in addr and key[0].startswith('router bgp'):
|
||||
# This is most likely an error because with no
|
||||
# prefixlen, BGP treats the prefixlen as 8
|
||||
addr = addr + '/8'
|
||||
|
||||
try:
|
||||
newaddr = IPNetwork(addr)
|
||||
line = 'network %s/%s %s' % (newaddr.network,
|
||||
newaddr.prefixlen,
|
||||
re_net.group(2))
|
||||
newlines.append(line)
|
||||
except ValueError:
|
||||
# Really this should be an error. Whats a network
|
||||
# without an IP Address following it ?
|
||||
newlines.append(line)
|
||||
else:
|
||||
newlines.append(line)
|
||||
lines = newlines
|
||||
|
||||
'''
|
||||
More fixups in user specification and what running config shows.
|
||||
"null0" in routes must be replaced by Null0, and "blackhole" must
|
||||
be replaced by Null0 as well.
|
||||
'''
|
||||
if (key[0].startswith('ip route') or key[0].startswith('ipv6 route') and
|
||||
'null0' in key[0] or 'blackhole' in key[0]):
|
||||
key[0] = re.sub(r'\s+null0(\s*$)', ' Null0', key[0])
|
||||
key[0] = re.sub(r'\s+blackhole(\s*$)', ' Null0', key[0])
|
||||
|
||||
if lines:
|
||||
if tuple(key) not in self.contexts:
|
||||
ctx = Context(tuple(key), lines)
|
||||
@ -437,16 +531,25 @@ def get_normalized_ipv6_line(line):
|
||||
"""
|
||||
Return a normalized IPv6 line as produced by frr,
|
||||
with all letters in lower case and trailing and leading
|
||||
zeros removed
|
||||
zeros removed, and only the network portion present if
|
||||
the IPv6 word is a network
|
||||
"""
|
||||
norm_line = ""
|
||||
words = line.split(' ')
|
||||
for word in words:
|
||||
if ":" in word:
|
||||
try:
|
||||
norm_word = str(IPv6Address(word)).lower()
|
||||
except:
|
||||
norm_word = word
|
||||
norm_word = None
|
||||
if "/" in word:
|
||||
try:
|
||||
v6word = IPNetwork(word)
|
||||
norm_word = '%s/%s' % (v6word.network, v6word.prefixlen)
|
||||
except ValueError:
|
||||
pass
|
||||
if not norm_word:
|
||||
try:
|
||||
norm_word = '%s' % IPv6Address(word)
|
||||
except ValueError:
|
||||
norm_word = word
|
||||
else:
|
||||
norm_word = word
|
||||
norm_line = norm_line + " " + norm_word
|
||||
@ -579,6 +682,60 @@ def ignore_delete_re_add_lines(lines_to_add, lines_to_del):
|
||||
lines_to_add_to_del.append((ctx_keys, swpx_interface))
|
||||
lines_to_add_to_del.append((tmp_ctx_keys, swpx_remoteas))
|
||||
|
||||
'''
|
||||
In 3.0, we made bgp bestpath multipath as-relax command
|
||||
automatically assume no-as-set since the lack of this option caused
|
||||
weird routing problems and this problem was peculiar to this
|
||||
implementation. When the running config is shown in relases after
|
||||
3.0, the no-as-set is not shown as its the default. This causes
|
||||
reload to unnecessarily unapply this option to only apply it back
|
||||
again, causing unnecessary session resets. Handle this.
|
||||
'''
|
||||
if ctx_keys[0].startswith('router bgp') and line and 'multipath-relax' in line:
|
||||
re_asrelax_new = re.search('^bgp\s+bestpath\s+as-path\s+multipath-relax$', line)
|
||||
old_asrelax_cmd = 'bgp bestpath as-path multipath-relax no-as-set'
|
||||
found_asrelax_old = line_exist(lines_to_add, ctx_keys, old_asrelax_cmd)
|
||||
|
||||
if re_asrelax_new and found_asrelax_old:
|
||||
deleted = True
|
||||
lines_to_del_to_del.append((ctx_keys, line))
|
||||
lines_to_add_to_del.append((ctx_keys, old_asrelax_cmd))
|
||||
|
||||
'''
|
||||
More old-to-new config handling. ip import-table no longer accepts
|
||||
distance, but we honor the old syntax. But 'show running' shows only
|
||||
the new syntax. This causes an unnecessary 'no import-table' followed
|
||||
by the same old 'ip import-table' which causes perturbations in
|
||||
announced routes leading to traffic blackholes. Fix this issue.
|
||||
'''
|
||||
re_importtbl = re.search('^ip\s+import-table\s+(\d+)$', ctx_keys[0])
|
||||
if re_importtbl:
|
||||
table_num = re_importtbl.group(1)
|
||||
for ctx in lines_to_add:
|
||||
if ctx[0][0].startswith('ip import-table %s distance' % table_num):
|
||||
lines_to_del_to_del.append((('ip import-table %s' % table_num,), None))
|
||||
lines_to_add_to_del.append((ctx[0], None))
|
||||
|
||||
'''
|
||||
ip/ipv6 prefix-list can be specified without a seq number. However,
|
||||
the running config always adds 'seq x', where x is a number incremented
|
||||
by 5 for every element, to the prefix list. So, ignore such lines as
|
||||
well. Sample prefix-list lines:
|
||||
ip prefix-list PR-TABLE-2 seq 5 permit 20.8.2.0/24 le 32
|
||||
ip prefix-list PR-TABLE-2 seq 10 permit 20.8.2.0/24 le 32
|
||||
ipv6 prefix-list vrfdev6-12 permit 2000:9:2::/64 gt 64
|
||||
'''
|
||||
re_ip_pfxlst = re.search('^(ip|ipv6)(\s+prefix-list\s+)(\S+\s+)(seq \d+\s+)(permit|deny)(.*)$',
|
||||
ctx_keys[0])
|
||||
if re_ip_pfxlst:
|
||||
tmpline = (re_ip_pfxlst.group(1) + re_ip_pfxlst.group(2) +
|
||||
re_ip_pfxlst.group(3) + re_ip_pfxlst.group(5) +
|
||||
re_ip_pfxlst.group(6))
|
||||
for ctx in lines_to_add:
|
||||
if ctx[0][0] == tmpline:
|
||||
lines_to_del_to_del.append((ctx_keys, None))
|
||||
lines_to_add_to_del.append(((tmpline,), None))
|
||||
|
||||
if not deleted:
|
||||
found_add_line = line_exist(lines_to_add, ctx_keys, line)
|
||||
|
||||
@ -646,6 +803,11 @@ def compare_context_objects(newconf, running):
|
||||
delete_bgpd = True
|
||||
lines_to_del.append((running_ctx_keys, None))
|
||||
|
||||
# We cannot do 'no interface' in quagga, and so deal with it
|
||||
elif running_ctx_keys[0].startswith('interface'):
|
||||
for line in running_ctx.lines:
|
||||
lines_to_del.append((running_ctx_keys, line))
|
||||
|
||||
# If this is an address-family under 'router bgp' and we are already deleting the
|
||||
# entire 'router bgp' context then ignore this sub-context
|
||||
elif "router bgp" in running_ctx_keys[0] and len(running_ctx_keys) > 1 and delete_bgpd:
|
||||
@ -697,6 +859,7 @@ if __name__ == '__main__':
|
||||
parser.add_argument('--debug', action='store_true', help='Enable debugs', default=False)
|
||||
parser.add_argument('--stdout', action='store_true', help='Log to STDOUT', default=False)
|
||||
parser.add_argument('filename', help='Location of new frr config file')
|
||||
parser.add_argument('--overwrite', action='store_true', help='Overwrite Quagga.conf with running config output', default=False)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Logging
|
||||
@ -904,5 +1067,6 @@ if __name__ == '__main__':
|
||||
subprocess.call(['/usr/bin/vtysh', '-f', filename])
|
||||
os.unlink(filename)
|
||||
|
||||
# Make these changes persistent
|
||||
# Make these changes persistent
|
||||
if args.overwrite or args.filename != '/etc/quagga/Quagga.conf':
|
||||
subprocess.call(['/usr/bin/vtysh', '-c', 'write'])
|
||||
|
@ -62,6 +62,9 @@ $ignore{'"address-family vpnv4 unicast"'} = "ignore";
|
||||
$ignore{'"address-family ipv4 vrf NAME"'} = "ignore";
|
||||
$ignore{'"address-family <encap|encapv4>"'} = "ignore";
|
||||
$ignore{'"address-family encapv6"'} = "ignore";
|
||||
$ignore{'"address-family ipv4 encap"'} = "ignore";
|
||||
$ignore{'"address-family ipv6 encap"'} = "ignore";
|
||||
$ignore{'"address-family ipv6 vpn"'} = "ignore";
|
||||
$ignore{'"address-family vpnv6"'} = "ignore";
|
||||
$ignore{'"address-family vpnv6 unicast"'} = "ignore";
|
||||
$ignore{'"exit-address-family"'} = "ignore";
|
||||
|
@ -2842,13 +2842,34 @@ vtysh_connect (struct vtysh_client *vclient)
|
||||
int sock, len;
|
||||
struct sockaddr_un addr;
|
||||
struct stat s_stat;
|
||||
char path[MAXPATHLEN];
|
||||
|
||||
if (vty_sock_path == NULL)
|
||||
strlcpy (path, vclient->path, sizeof (path));
|
||||
else {
|
||||
/* Different path for VTY Socket specified
|
||||
overriding the default path, but keep the filename */
|
||||
strlcpy (path, vty_sock_path, sizeof (path));
|
||||
|
||||
if (strrchr (vclient->path, '/') != NULL)
|
||||
strlcat (path, strrchr (vclient->path, '/'), sizeof (path));
|
||||
else {
|
||||
/*
|
||||
* vclient->path configured as relative path during config? Should
|
||||
* really never happen for sensible config
|
||||
*/
|
||||
strlcat (path, "/", sizeof (path));
|
||||
strlcat (path, vclient->path, sizeof (path));
|
||||
}
|
||||
}
|
||||
path[sizeof(path)-1] = '\0';
|
||||
|
||||
/* Stat socket to see if we have permission to access it. */
|
||||
ret = stat (vclient->path, &s_stat);
|
||||
ret = stat (path, &s_stat);
|
||||
if (ret < 0 && errno != ENOENT)
|
||||
{
|
||||
fprintf (stderr, "vtysh_connect(%s): stat = %s\n",
|
||||
vclient->path, safe_strerror(errno));
|
||||
path, safe_strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -2857,7 +2878,7 @@ vtysh_connect (struct vtysh_client *vclient)
|
||||
if (! S_ISSOCK(s_stat.st_mode))
|
||||
{
|
||||
fprintf (stderr, "vtysh_connect(%s): Not a socket\n",
|
||||
vclient->path);
|
||||
path);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
@ -2867,7 +2888,7 @@ vtysh_connect (struct vtysh_client *vclient)
|
||||
if (sock < 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "vtysh_connect(%s): socket = %s\n", vclient->path,
|
||||
fprintf(stderr, "vtysh_connect(%s): socket = %s\n", path,
|
||||
safe_strerror(errno));
|
||||
#endif /* DEBUG */
|
||||
return -1;
|
||||
@ -2875,7 +2896,7 @@ vtysh_connect (struct vtysh_client *vclient)
|
||||
|
||||
memset (&addr, 0, sizeof (struct sockaddr_un));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy (addr.sun_path, vclient->path, strlen (vclient->path));
|
||||
strncpy (addr.sun_path, path, strlen (path));
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
|
||||
len = addr.sun_len = SUN_LEN(&addr);
|
||||
#else
|
||||
@ -2886,7 +2907,7 @@ vtysh_connect (struct vtysh_client *vclient)
|
||||
if (ret < 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "vtysh_connect(%s): connect = %s\n", vclient->path,
|
||||
fprintf(stderr, "vtysh_connect(%s): connect = %s\n", path,
|
||||
safe_strerror(errno));
|
||||
#endif /* DEBUG */
|
||||
close (sock);
|
||||
@ -2937,14 +2958,23 @@ vtysh_update_all_insances(struct vtysh_client * head_client)
|
||||
{
|
||||
struct vtysh_client *client;
|
||||
char *ptr;
|
||||
char vty_dir[MAXPATHLEN];
|
||||
DIR *dir;
|
||||
struct dirent *file;
|
||||
int n = 0;
|
||||
|
||||
if (head_client->flag != VTYSH_OSPFD) return;
|
||||
|
||||
/* ls DAEMON_VTY_DIR and look for all files ending in .vty */
|
||||
dir = opendir(DAEMON_VTY_DIR "/");
|
||||
if (vty_sock_path == NULL)
|
||||
/* ls DAEMON_VTY_DIR and look for all files ending in .vty */
|
||||
strlcpy(vty_dir, DAEMON_VTY_DIR "/", MAXPATHLEN);
|
||||
else
|
||||
{
|
||||
/* ls vty_sock_dir and look for all files ending in .vty */
|
||||
strlcpy(vty_dir, vty_sock_path, MAXPATHLEN);
|
||||
strlcat(vty_dir, "/", MAXPATHLEN);
|
||||
}
|
||||
dir = opendir(vty_dir);
|
||||
if (dir)
|
||||
{
|
||||
while ((file = readdir(dir)) != NULL)
|
||||
@ -2954,8 +2984,8 @@ vtysh_update_all_insances(struct vtysh_client * head_client)
|
||||
if (n == MAXIMUM_INSTANCES)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Parsing %s/, client limit(%d) reached!\n",
|
||||
DAEMON_VTY_DIR, n);
|
||||
"Parsing %s, client limit(%d) reached!\n",
|
||||
vty_dir, n);
|
||||
break;
|
||||
}
|
||||
client = (struct vtysh_client *) malloc(sizeof(struct vtysh_client));
|
||||
@ -2963,7 +2993,7 @@ vtysh_update_all_insances(struct vtysh_client * head_client)
|
||||
client->name = "ospfd";
|
||||
client->flag = VTYSH_OSPFD;
|
||||
ptr = (char *) malloc(100);
|
||||
sprintf(ptr, "%s/%s", DAEMON_VTY_DIR, file->d_name);
|
||||
sprintf(ptr, "%s%s", vty_dir, file->d_name);
|
||||
client->path = (const char *)ptr;
|
||||
client->next = NULL;
|
||||
vtysh_client_sorted_insert(head_client, client);
|
||||
|
@ -96,4 +96,6 @@ extern int execute_flag;
|
||||
|
||||
extern struct vty *vty;
|
||||
|
||||
extern char * vty_sock_path;
|
||||
|
||||
#endif /* VTYSH_H */
|
||||
|
@ -45,14 +45,17 @@
|
||||
char *progname;
|
||||
|
||||
/* Configuration file name and directory. */
|
||||
static char vtysh_config_always[] = SYSCONFDIR VTYSH_DEFAULT_CONFIG;
|
||||
static char quagga_config_default[] = SYSCONFDIR QUAGGA_DEFAULT_CONFIG;
|
||||
static char vtysh_config_always[MAXPATHLEN] = SYSCONFDIR VTYSH_DEFAULT_CONFIG;
|
||||
static char quagga_config_default[MAXPATHLEN] = SYSCONFDIR QUAGGA_DEFAULT_CONFIG;
|
||||
char *quagga_config = quagga_config_default;
|
||||
char history_file[MAXPATHLEN];
|
||||
|
||||
/* Flag for indicate executing child command. */
|
||||
int execute_flag = 0;
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char * vty_sock_path = NULL;
|
||||
|
||||
/* For sigsetjmp() & siglongjmp(). */
|
||||
static sigjmp_buf jmpbuf;
|
||||
|
||||
@ -144,8 +147,11 @@ usage (int status)
|
||||
"-f, --inputfile Execute commands from specific file and exit\n" \
|
||||
"-E, --echo Echo prompt and command in -c mode\n" \
|
||||
"-C, --dryrun Check configuration for validity and exit\n" \
|
||||
"-m, --markfile Mark input file with context end\n"
|
||||
"-w, --writeconfig Write integrated config (Quagga.conf) and exit\n"
|
||||
" --vty_socket Override vty socket path\n" \
|
||||
"-m, --markfile Mark input file with context end\n" \
|
||||
" --vty_socket Override vty socket path\n" \
|
||||
" --config_dir Override config directory path\n" \
|
||||
"-w, --writeconfig Write integrated config (Quagga.conf) and exit\n" \
|
||||
"-h, --help Display this help and exit\n\n" \
|
||||
"Note that multiple commands may be executed from the command\n" \
|
||||
"line by passing multiple -c args, or by embedding linefeed\n" \
|
||||
@ -156,6 +162,8 @@ usage (int status)
|
||||
}
|
||||
|
||||
/* VTY shell options, we use GNU getopt library. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
#define OPTION_CONFDIR 1001
|
||||
struct option longopts[] =
|
||||
{
|
||||
{ "boot", no_argument, NULL, 'b'},
|
||||
@ -163,6 +171,8 @@ struct option longopts[] =
|
||||
{ "eval", required_argument, NULL, 'e'},
|
||||
{ "command", required_argument, NULL, 'c'},
|
||||
{ "daemon", required_argument, NULL, 'd'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
|
||||
{ "config_dir", required_argument, NULL, OPTION_CONFDIR},
|
||||
{ "inputfile", required_argument, NULL, 'f'},
|
||||
{ "echo", no_argument, NULL, 'E'},
|
||||
{ "dryrun", no_argument, NULL, 'C'},
|
||||
@ -262,6 +272,7 @@ main (int argc, char **argv, char **env)
|
||||
int boot_flag = 0;
|
||||
const char *daemon_name = NULL;
|
||||
const char *inputfile = NULL;
|
||||
const char *vtysh_configfile_name;
|
||||
struct cmd_rec {
|
||||
const char *line;
|
||||
struct cmd_rec *next;
|
||||
@ -274,6 +285,9 @@ main (int argc, char **argv, char **env)
|
||||
int ret = 0;
|
||||
char *homedir = NULL;
|
||||
|
||||
/* check for restricted functionality if vtysh is run setuid */
|
||||
int restricted = (getuid() != geteuid()) || (getgid() != getegid());
|
||||
|
||||
/* Preserve name of myself. */
|
||||
progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
|
||||
|
||||
@ -310,6 +324,55 @@ main (int argc, char **argv, char **env)
|
||||
tail = cr;
|
||||
}
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
vty_sock_path = optarg;
|
||||
break;
|
||||
case OPTION_CONFDIR:
|
||||
/*
|
||||
* Skip option for Config Directory if setuid
|
||||
*/
|
||||
if (restricted)
|
||||
{
|
||||
fprintf (stderr, "Overriding of Config Directory blocked for vtysh with setuid");
|
||||
return 1;
|
||||
}
|
||||
/*
|
||||
* Overwrite location for vtysh.conf
|
||||
*/
|
||||
vtysh_configfile_name = strrchr(VTYSH_DEFAULT_CONFIG, '/');
|
||||
if (vtysh_configfile_name)
|
||||
/* skip '/' */
|
||||
vtysh_configfile_name++;
|
||||
else
|
||||
/*
|
||||
* VTYSH_DEFAULT_CONFIG configured with relative path
|
||||
* during config? Should really never happen for
|
||||
* sensible config
|
||||
*/
|
||||
vtysh_configfile_name = (char *) VTYSH_DEFAULT_CONFIG;
|
||||
strlcpy(vtysh_config_always, optarg, sizeof(vtysh_config_always));
|
||||
strlcat(vtysh_config_always, "/", sizeof(vtysh_config_always));
|
||||
strlcat(vtysh_config_always, vtysh_configfile_name,
|
||||
sizeof(vtysh_config_always));
|
||||
/*
|
||||
* Overwrite location for Quagga.conf
|
||||
*/
|
||||
vtysh_configfile_name = strrchr(QUAGGA_DEFAULT_CONFIG, '/');
|
||||
if (vtysh_configfile_name)
|
||||
/* skip '/' */
|
||||
vtysh_configfile_name++;
|
||||
else
|
||||
/*
|
||||
* QUAGGA_DEFAULT_CONFIG configured with relative path
|
||||
* during config? Should really never happen for
|
||||
* sensible config
|
||||
*/
|
||||
vtysh_configfile_name = (char *) QUAGGA_DEFAULT_CONFIG;
|
||||
strlcpy(quagga_config_default, optarg, sizeof(vtysh_config_always));
|
||||
strlcat(quagga_config_default, "/", sizeof(vtysh_config_always));
|
||||
strlcat(quagga_config_default, vtysh_configfile_name,
|
||||
sizeof(quagga_config_default));
|
||||
break;
|
||||
case 'd':
|
||||
daemon_name = optarg;
|
||||
break;
|
||||
|
@ -220,7 +220,12 @@ char *
|
||||
vtysh_get_home (void)
|
||||
{
|
||||
struct passwd *passwd;
|
||||
char * homedir;
|
||||
|
||||
if ((homedir = getenv("HOME")) != 0)
|
||||
return homedir;
|
||||
|
||||
/* Fallback if HOME is undefined */
|
||||
passwd = getpwuid (getuid ());
|
||||
|
||||
return passwd ? passwd->pw_dir : NULL;
|
||||
|
12
zebra/main.c
12
zebra/main.c
@ -35,6 +35,7 @@
|
||||
#include "privs.h"
|
||||
#include "sigevent.h"
|
||||
#include "vrf.h"
|
||||
#include "sockopt.h"
|
||||
|
||||
#include "zebra/rib.h"
|
||||
#include "zebra/zserv.h"
|
||||
@ -59,6 +60,9 @@ struct zebra_t zebrad =
|
||||
/* process id. */
|
||||
pid_t pid;
|
||||
|
||||
/* VTY Socket prefix */
|
||||
char vty_sock_path[MAXPATHLEN] = ZEBRA_VTYSH_PATH;
|
||||
|
||||
/* Pacify zclient.o in libzebra, which expects this variable. */
|
||||
struct thread_master *master;
|
||||
|
||||
@ -77,6 +81,7 @@ u_int32_t nl_rcvbufsize = 4194304;
|
||||
#endif /* HAVE_NETLINK */
|
||||
|
||||
/* Command line options. */
|
||||
#define OPTION_VTYSOCK 1000
|
||||
struct option longopts[] =
|
||||
{
|
||||
{ "batch", no_argument, NULL, 'b'},
|
||||
@ -90,6 +95,7 @@ struct option longopts[] =
|
||||
{ "help", no_argument, NULL, 'h'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK },
|
||||
{ "retain", no_argument, NULL, 'r'},
|
||||
{ "dryrun", no_argument, NULL, 'C'},
|
||||
#ifdef HAVE_NETLINK
|
||||
@ -152,6 +158,7 @@ usage (char *progname, int status)
|
||||
"-C, --dryrun Check configuration for validity and exit\n"\
|
||||
"-A, --vty_addr Set vty's bind address\n"\
|
||||
"-P, --vty_port Set vty's port number\n"\
|
||||
" --vty_socket Override vty socket path\n"\
|
||||
"-r, --retain When program terminates, retain added route "\
|
||||
"by zebra.\n"\
|
||||
"-u, --user User to run as\n"\
|
||||
@ -339,6 +346,9 @@ main (int argc, char **argv)
|
||||
if (vty_port <= 0 || vty_port > 0xffff)
|
||||
vty_port = ZEBRA_VTY_PORT;
|
||||
break;
|
||||
case OPTION_VTYSOCK:
|
||||
set_socket_path(vty_sock_path, ZEBRA_VTYSH_PATH, optarg, sizeof (vty_sock_path));
|
||||
break;
|
||||
case 'r':
|
||||
retain_mode = 1;
|
||||
break;
|
||||
@ -463,7 +473,7 @@ main (int argc, char **argv)
|
||||
zebra_zserv_socket_init (zserv_path);
|
||||
|
||||
/* Make vty server socket. */
|
||||
vty_serv_sock (vty_addr, vty_port, ZEBRA_VTYSH_PATH);
|
||||
vty_serv_sock (vty_addr, vty_port, vty_sock_path);
|
||||
|
||||
/* Print banner. */
|
||||
zlog_notice ("Zebra %s starting: vty@%d", FRR_VERSION, vty_port);
|
||||
|
@ -868,8 +868,10 @@ _netlink_route_build_singlepath(
|
||||
if (nexthop->type == NEXTHOP_TYPE_IPV4
|
||||
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
|
||||
{
|
||||
_netlink_route_nl_add_gateway_info (rtmsg->rtm_family, AF_INET, nlmsg,
|
||||
req_size, bytelen, nexthop);
|
||||
/* Send deletes to the kernel without specifying the next-hop */
|
||||
if (cmd != RTM_DELROUTE)
|
||||
_netlink_route_nl_add_gateway_info (rtmsg->rtm_family, AF_INET, nlmsg,
|
||||
req_size, bytelen, nexthop);
|
||||
|
||||
if (cmd == RTM_NEWROUTE)
|
||||
{
|
||||
|
@ -459,6 +459,7 @@ zebra_ptm_handle_bfd_msg(void *arg, void *in_ctxt, struct interface *ifp)
|
||||
char vrf_str[64];
|
||||
struct prefix dest_prefix;
|
||||
struct prefix src_prefix;
|
||||
vrf_id_t vrf_id;
|
||||
|
||||
ptm_lib_find_key_in_msg(in_ctxt, ZEBRA_PTM_BFDSTATUS_STR, bfdst_str);
|
||||
|
||||
@ -491,7 +492,8 @@ zebra_ptm_handle_bfd_msg(void *arg, void *in_ctxt, struct interface *ifp)
|
||||
}
|
||||
|
||||
if (IS_ZEBRA_DEBUG_EVENT)
|
||||
zlog_debug("%s: Recv Port [%s] bfd status [%s] vrf [%s] peer [%s] local [%s]",
|
||||
zlog_debug("%s: Recv Port [%s] bfd status [%s] vrf [%s]"
|
||||
" peer [%s] local [%s]",
|
||||
__func__, ifp ? ifp->name : "N/A", bfdst_str,
|
||||
vrf_str, dest_str, src_str);
|
||||
|
||||
@ -510,12 +512,18 @@ zebra_ptm_handle_bfd_msg(void *arg, void *in_ctxt, struct interface *ifp)
|
||||
}
|
||||
}
|
||||
|
||||
if (!strcmp(ZEBRA_PTM_INVALID_VRF, vrf_str) && ifp) {
|
||||
vrf_id = ifp->vrf_id;
|
||||
} else {
|
||||
vrf_id = vrf_name_to_id(vrf_str);
|
||||
}
|
||||
|
||||
if (!strcmp (bfdst_str, ZEBRA_PTM_BFDSTATUS_DOWN_STR)) {
|
||||
if_bfd_session_update(ifp, &dest_prefix, &src_prefix, BFD_STATUS_DOWN,
|
||||
vrf_name_to_id(vrf_str));
|
||||
vrf_id);
|
||||
} else {
|
||||
if_bfd_session_update(ifp, &dest_prefix, &src_prefix, BFD_STATUS_UP,
|
||||
vrf_name_to_id(vrf_str));
|
||||
vrf_id);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user