[TOC]
+## General note on this document
+
+This document is "descriptive/post-factual" in that it documents pratices that
+are in use; it is not "definitive/pre-factual" in prescribing practices.
+
+This means that when a procedure changes, it is agreed upon, then put into
+practice, and then documented here. If this document doesn't match reality,
+it's the document that needs to be updated, not reality.
+
+
## Git Structure
The master Git for PROJECT resides on Github at
![git branches continually merging to the left from 3 lanes; float-right](doc/git_branches.svg
"git branch mechanics")
-There are 3 main branches for development and a release branch for each
+There is one main branch for development and a release branch for each
major release.
-New contributions are done against the head of the Develop branch. The CI
+New contributions are done against the head of the master branch. The CI
systems will pick up the Github Pull Requests or the new patch from
-Patchwork, run some basic build and functional tests and will merge them
-into the branch automatically on success.
-
-Code on the develop branch will then be further tested and reviewed by the
-community and merged to master on a regular interval.
+Patchwork, run some basic build and functional tests.
For each major release (1.0, 1.1 etc) a new release branch is created based
on the master.
+There was an attempt to use a "develop" branch automatically maintained by
+the CI system. This is not currently in active use, though the system is
+operational. If the "develop" branch is in active use and this paragraph
+is still here, this document obviously wasn't updated.
+
## Programming language, Tools and Libraries
### Code styling / format
-GNU coding standards apply. Indentation follows the result of invoking GNU
-indent (as of 2.2.8a) with the `-nut -nfc1` arguments.
+Coding style standards in FRR vary depending on location. Pre-existing
+code uses GNU coding standards. New code may use Linux kernel coding style.
+
+GNU coding style apply to the following parts:
+
+* lib/
+* zebra/
+* bgpd/
+* ospfd/
+* ospf6d/
+* isisd/
+* ripd/
+* ripngd/
+* vtysh/
+
+Linux kernel coding style applies to:
+
+* nhrpd/
+* watchfrr/
+* pimd/
+* lib/{checksum,hook,imsg-buffer,imsg,libfrr,md5,module,monotime,queue}.[ch]
+
+BSD coding style applies to:
+
+* ldpd/
+
+**Whitespace changes in untouched parts of the code are not acceptable in
+patches that change actual code.** To change/fix formatting issues, please
+create a separate patch that only does formatting changes and nothing else.
+
+It is acceptable to rewrap entire files to Linux kernel style, but this
+**MUST** come as a separate patch that does nothing other than this
+reformatting.
+
+
+#### GNU style
+
+For GNU coding style, Indentation follows the result of invoking GNU indent:
```
indent -nut -nfc1 file_for_submission.c
```
-Please don’t reformat existing files (or only sections modified by your
-changes), even if they don’t follow the standard. This makes it very hard to
-highlight the changes
+Originally, tabs were used instead of spaces, with tabs are every 8 columns.
+However, tab interoperability issues mean space characters are now preferred for
+new changes. We generally only clean up whitespace when code is unmaintainable
+due to whitespace issues, to minimise merging conflicts.
+
+
+#### Linux kernel & BSD style
+
+These styles are documented externally:
+
+* [https://www.kernel.org/doc/Documentation/CodingStyle](https://www.kernel.org/doc/Documentation/CodingStyle).
+* [http://man.openbsd.org/style](http://man.openbsd.org/style)
+
+They are relatively similar but differ in details.
+
+pimd deviates from Linux kernel style in using 2 spaces for indentation, with
+Tabs replacing 8 spaces, as well as adding a line break between `}` and `else`.
+It is acceptable to convert indentation in pimd/ to Linux kernel style, but
+please convert an entire file at a time. (Rationale: apart from 2-space
+indentation, the styles are sufficiently close to not upset when mixed.)
+
+Unlike GNU style, these styles use tabs, not spaces.
+
### Compile-Time conditional code
CLI's are a complicated ugly beast. Additions or changes to the CLI
should use a DEFUN to encapsulate one setting as much as is possible.
Additionally as new DEFUN's are added to the system, documentation
-should be provided for the new commands.
\ No newline at end of file
+should be provided for the new commands.
-ChangeLog information for FreeRangeRouting is for now recorded in source-code
+ChangeLog information for FRRouting is for now recorded in source-code
management system. Please see:
- http://www.freerangerouting.org/
+ http://www.frrouting.org/
tools/zebra.el tools/multiple-bgpd.sh
ACLOCAL_AMFLAGS = -I m4
+
+noinst_HEADERS = defaults.h
-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
+This file describes the procedure for reporting FRRouting bugs. You are not
+obliged to follow this format, but it would be great help for FRRouting developers
if you report a bug as described below.
Bugs submitted with woefully incomplete information may be summarily
information.
Report bugs on Github Issue Tracker at
- https://github.com/freerangerouting/frr/issues
+ https://github.com/frrouting/frr/issues
Please supply the following information:
-1. Your FreeRangeRouting version or if it is from git then the commit reference.
+1. Your FRRouting version or if it is from git then the commit reference.
Please try to report bugs against git master or the latest release.
2. FRR daemons you run e.g. bgpd or ripd and full name of your OS. Any
specific options you compiled Quagga with.
bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
bgp->dynamic_neighbors_limit = BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT;
bgp->dynamic_neighbors_count = 0;
+#if DFLT_BGP_IMPORT_CHECK
bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK);
+#endif
+#if DFLT_BGP_SHOW_HOSTNAME
bgp_flag_set (bgp, BGP_FLAG_SHOW_HOSTNAME);
+#endif
+#if DFLT_BGP_LOG_NEIGHBOR_CHANGES
bgp_flag_set (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
+#endif
+#if DFLT_BGP_DETERMINISTIC_MED
bgp_flag_set (bgp, BGP_FLAG_DETERMINISTIC_MED);
+#endif
bgp->addpath_tx_id = BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE;
bgp->as = *as;
inet_ntoa (bgp->router_id_static), VTY_NEWLINE);
/* BGP log-neighbor-changes. */
- if (!bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
- vty_out (vty, " no bgp log-neighbor-changes%s", VTY_NEWLINE);
+ if (!!bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)
+ != DFLT_BGP_LOG_NEIGHBOR_CHANGES)
+ vty_out (vty, " %sbgp log-neighbor-changes%s",
+ bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES) ? "" : "no ",
+ VTY_NEWLINE);
/* BGP configuration. */
if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED))
bgp->default_local_pref, VTY_NEWLINE);
/* BGP default show-hostname */
- if (!bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
- vty_out (vty, " no bgp default show-hostname%s", VTY_NEWLINE);
+ if (!!bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME)
+ != DFLT_BGP_SHOW_HOSTNAME)
+ vty_out (vty, " %sbgp default show-hostname%s",
+ bgp_flag_check (bgp, BGP_FLAG_SHOW_HOSTNAME) ? "" : "no ",
+ VTY_NEWLINE);
/* BGP default subgroup-pkt-queue-max. */
if (bgp->default_subgroup_pkt_queue_max != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
vty_out (vty, " bgp enforce-first-as%s", VTY_NEWLINE);
/* BGP deterministic-med. */
- if (!bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
- vty_out (vty, " no bgp deterministic-med%s", VTY_NEWLINE);
+ if (!!bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
+ != DFLT_BGP_DETERMINISTIC_MED)
+ vty_out (vty, " %sbgp deterministic-med%s",
+ bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED) ? "" : "no ",
+ VTY_NEWLINE);
/* BGP update-delay. */
bgp_config_write_update_delay (vty, bgp);
}
/* BGP network import check. */
- if (!bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
- vty_out (vty, " no bgp network import-check%s", VTY_NEWLINE);
+ if (!!bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK)
+ != DFLT_BGP_IMPORT_CHECK)
+ vty_out (vty, " %sbgp network import-check%s",
+ bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK) ? "" : "no ",
+ VTY_NEWLINE);
/* BGP flag dampening. */
if (CHECK_FLAG (bgp->af_flags[AFI_IP][SAFI_UNICAST],
#include "sockunion.h"
#include "routemap.h"
#include "linklist.h"
+#include "defaults.h"
#include "bgp_memory.h"
#define BGP_MAX_HOSTNAME 64 /* Linux max, is larger than most other sys */
#define BGP_EVENTS_MAX 15
/* BGP timers default value. */
+/* note: the DFLT_ ones depend on compile-time "defaults" selection */
#define BGP_INIT_START_TIMER 1
-#define BGP_DEFAULT_HOLDTIME 9
-#define BGP_DEFAULT_KEEPALIVE 3
+#define BGP_DEFAULT_HOLDTIME DFLT_BGP_HOLDTIME
+#define BGP_DEFAULT_KEEPALIVE DFLT_BGP_KEEPALIVE
#define BGP_DEFAULT_EBGP_ROUTEADV 0
#define BGP_DEFAULT_IBGP_ROUTEADV 0
-#define BGP_DEFAULT_CONNECT_RETRY 10
+#define BGP_DEFAULT_CONNECT_RETRY DFLT_BGP_TIMERS_CONNECT
/* BGP default local preference. */
#define BGP_DEFAULT_LOCAL_PREF 100
##
-## Configure template file for FreeRangeRouting.
+## Configure template file for FRRouting.
## autoconf will generate configure script.
##
## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
##
AC_PREREQ(2.60)
-AC_INIT(frr, 2.1-dev, [https://github.com/freerangerouting/frr/issues])
-PACKAGE_URL="https://freerangerouting.org/"
-PACKAGE_FULLNAME="FreeRangeRouting"
+AC_INIT(frr, 2.1-dev, [https://github.com/frrouting/frr/issues])
+PACKAGE_URL="https://frrouting.org/"
+PACKAGE_FULLNAME="FRRouting"
AC_SUBST(PACKAGE_FULLNAME)
CONFIG_ARGS="$ac_configure_args"
if test "${enable_cumulus}" = "yes" ; then
AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
+ DFLT_NAME="datacenter"
+else
+ DFLT_NAME="traditional"
fi
+AC_SUBST(DFLT_NAME)
+AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
if test "${enable_shell_access}" = "yes"; then
AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
snapcraft/Makefile
snapcraft/snapcraft.yaml
lib/version.h
+ tests/lib/cli/test_cli.refout
doc/defines.texi
doc/bgpd.8
doc/isisd.8
AC_OUTPUT
echo "
-FreeRangeRouting configuration
+FRRouting configuration
------------------------------
FRR version : ${PACKAGE_VERSION}
host operating system : ${host_os}
* What is frr?
=================
-http://www.freerangerouting.org/
+http://www.frrouting.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
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Frr
-Upstream-Contact: maintainers@freerangerouting.org, security@freerangerouting.org
-Source: http://www.freerangerouting.org/
+Upstream-Contact: maintainers@frrouting.org, security@frrouting.org
+Source: http://www.frrouting.org/
Files: *
Copyright: 1996-2003 by the original Zebra authors:
--- /dev/null
+/*
+ * FRR switchable defaults.
+ * Copyright (C) 2017 David Lamparter for NetDEF, Inc.
+ *
+ * This file is part of FRRouting (FRR).
+ *
+ * FRR is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2, or (at your option) any later version.
+ *
+ * FRR is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with FRR; see the file COPYING. If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _FRR_DEFAULTS_H
+#define _FRR_DEFAULTS_H
+
+#include "config.h"
+
+#ifdef HAVE_CUMULUS
+
+#define DFLT_BGP_IMPORT_CHECK 1
+#define DFLT_BGP_TIMERS_CONNECT 10
+#define DFLT_BGP_HOLDTIME 9
+#define DFLT_BGP_KEEPALIVE 3
+#define DFLT_BGP_LOG_NEIGHBOR_CHANGES 1
+#define DFLT_BGP_SHOW_HOSTNAME 1
+#define DFLT_BGP_DETERMINISTIC_MED 1
+
+#define DFLT_OSPF_LOG_ADJACENCY_CHANGES 1
+#define DFLT_OSPF6_LOG_ADJACENCY_CHANGES 1
+
+#else /* !HAVE_CUMULUS */
+
+#define DFLT_BGP_IMPORT_CHECK 0
+#define DFLT_BGP_TIMERS_CONNECT 120
+#define DFLT_BGP_HOLDTIME 180
+#define DFLT_BGP_KEEPALIVE 60
+#define DFLT_BGP_LOG_NEIGHBOR_CHANGES 0
+#define DFLT_BGP_SHOW_HOSTNAME 0
+#define DFLT_BGP_DETERMINISTIC_MED 0
+
+#define DFLT_OSPF_LOG_ADJACENCY_CHANGES 0
+#define DFLT_OSPF6_LOG_ADJACENCY_CHANGES 0
+
+#endif /* !HAVE_CUMULUS */
+
+#endif /* _FRR_DEFAULTS_H */
sudo groupadd -g 92 frr
sudo groupadd -r -g 85 frrvt
sudo useradd -u 92 -g 92 -M -r -G frrvt -s /sbin/nologin \
- -c "FRR FreeRangeRouting suite" -d /var/run/frr frr
+ -c "FRR FRRouting suite" -d /var/run/frr frr
### Download Source, configure and compile it
(You may prefer different options on configure statement. These are just
You may want to pay special attention to `/usr/lib64` paths and change
them if you are not building on a x86_64 architecture
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
sudo groupadd -g 92 frr
sudo groupadd -r -g 85 frrvt
sudo useradd -u 92 -g 92 -M -r -G frrvt -s /sbin/nologin \
- -c "FRR FreeRangeRouting suite" -d /var/run/frr frr
+ -c "FRR FRRouting suite" -d /var/run/frr frr
### Download Source, configure and compile it
(You may prefer different options on configure statement. These are just
You may want to pay special attention to `/usr/lib64` paths and change
them if you are not building on a x86_64 architecture
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
sudo addgroup --system --gid 92 frr
sudo addgroup --system --gid 85 frrvty
sudo adduser --system --ingroup frr --groups frrvty --home /var/run/frr/ \
- --gecos "FRR FreeRangeRouting suite" --shell /bin/false frr
+ --gecos "FRR FRRouting suite" --shell /bin/false frr
sudo usermode
### Download Source, configure and compile it
(You may prefer different options on configure statement. These are just
an example.)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
sudo groupadd -g 92 frr
sudo groupadd -r -g 85 frrvt
sudo useradd -u 92 -g 92 -M -r -G frrvt -s /sbin/nologin \
- -c "FRR FreeRangeRouting suite" -d /var/run/frr frr
+ -c "FRR FRRouting suite" -d /var/run/frr frr
### Download Source, configure and compile it
(You may prefer different options on configure statement. These are just
You may want to pay special attention to `/usr/lib64` paths and change
them if you are not building on a x86_64 architecture
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
export MAKE=gmake
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
export MAKE=gmake
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
export MAKE=gmake
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
MAKE=gmake
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
MAKE=gmake
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
export MAKE=gmake
(You may prefer different options on configure statement. These are just
an example)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
export LDFLAGS="-L/usr/local/lib"
(You may prefer different options on configure statement. These are just
an example.)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
(You may prefer different options on configure statement. These are just
an example.)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
(You may prefer different options on configure statement. These are just
an example.)
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
cd frr
./bootstrap.sh
./configure \
@setfilename frr.info
@c Set variables - sourced from defines.texi
@include defines.texi
-@settitle @uref{http://www.freerangerouting.org,,@value{PACKAGE_NAME}}
+@settitle @uref{http://www.frrouting.org,,@value{PACKAGE_NAME}}
@c %**end of header
@c automake will automatically generate version.texi
TCP/IP routing protocols.
This is Edition @value{EDITION}, last updated @value{UPDATED} of
-@cite{The Frr Manual}, for @uref{http://www.freerangerouting.org/,,@value{PACKAGE_NAME}}
+@cite{The Frr Manual}, for @uref{http://www.frrouting.org/,,@value{PACKAGE_NAME}}
Version @value{VERSION}.
@insertcopying
@end ifinfo
@titlepage
-@title @uref{http://www.freerangerouting.org,,Frr}
+@title @uref{http://www.frrouting.org,,Frr}
@subtitle A routing software package for TCP/IP networks
-@subtitle @uref{http://www.freerangerouting.org,,@value{PACKAGE_NAME}} @value{VERSION}
+@subtitle @uref{http://www.frrouting.org,,@value{PACKAGE_NAME}} @value{VERSION}
@subtitle @value{UPDATED-MONTH}
@author @value{AUTHORS}
@node Top
@top Frr -- With Virtual Network Control
-@uref{http://www.freerangerouting.org,,Frr} is an advanced routing software package
+@uref{http://www.frrouting.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.org,,Frr} is a fork of
+for @value{PACKAGE_STRING}. @uref{http://www.frrouting.org,,Frr} is a fork of
@uref{http://www.quagga.net,,Quagga}.
@insertcopying
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" viewBox="52,37,407,656" width="407" height="656" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path fill="none" stroke="#008000" stroke-width="8" d="M288,252 L288,98.125"/><path fill="#008000" d="M277,99.5 L288,72 L299,99.5"/></g><path fill="none" stroke="#008000" stroke-width="8" d="M288.084,324 L216,288"/><g><path fill="none" stroke="#000100" stroke-width="8" d="M216,98.125 L216,684"/><path fill="#000100" d="M205,99.5 L216,72 L227,99.5"/><path fill="#000100" d="M225.625,692.25 L216,684 L206.375,692.25 L206.375,662 L216,653.75 L225.625,662"/></g><path fill="none" stroke="#f00" stroke-width="8" d="M216,648 L144,612"/><path fill="none" stroke="#f00" stroke-width="8" d="M216,432 L144,396"/><path fill="none" stroke="#008000" stroke-width="8" d="M216,612 L288.084,648"/><path fill="none" stroke="#008000" stroke-width="8" d="M216,468 L288.084,504"/><path fill="none" stroke="#008000" stroke-width="8" d="M288.084,180 L216,144"/><text fill="#f00" font-family="Helvetica" font-weight="bold" font-size="12" text-anchor="middle" transform="matrix(1,0,0,1,146.988,431.607)" xml:space="preserve"><tspan>1.0</tspan><tspan x="0" y="16">Release</tspan><tspan x="0" y="32">Branch</tspan></text><path fill="none" stroke="#008000" stroke-width="8" d="M288.084,396 L216,360"/><path fill="none" stroke="#008000" stroke-width="8" d="M288.084,432 L216,396"/><path fill="none" stroke="#f00" stroke-width="8" d="M216.832,396 L144,360"/><path fill="none" stroke="#f00" stroke-width="8" d="M215.832,360 L144,324"/><path fill="#fffffe" stroke="#000100" d="M224,648 C224,652.418,220.418,656,216,656 C211.582,656,208,652.418,208,648 C208,643.582,211.582,640,216,640 C220.418,640,224,643.582,224,648 Z"/><path fill="#fffffe" stroke="#000100" d="M224,468 C224,472.418,220.418,476,216,476 C211.582,476,208,472.418,208,468 C208,463.582,211.582,460,216,460 C220.418,460,224,463.582,224,468 Z"/><path fill="#fffffe" stroke="#000100" d="M224,432 C224,436.418,220.418,440,216,440 C211.582,440,208,436.418,208,432 C208,427.582,211.582,424,216,424 C220.418,424,224,427.582,224,432 Z"/><path fill="#fffffe" stroke="#000100" d="M224,612 C224,616.418,220.418,620,216,620 C211.582,620,208,616.418,208,612 C208,607.582,211.582,604,216,604 C220.418,604,224,607.582,224,612 Z"/><path fill="#fffffe" stroke="#000100" d="M224,144 C224,148.418,220.418,152,216,152 C211.582,152,208,148.418,208,144 C208,139.582,211.582,136,216,136 C220.418,136,224,139.582,224,144 Z"/><path fill="#fffffe" stroke="#000100" d="M296,144 C296,148.418,292.418,152,288,152 C283.582,152,280,148.418,280,144 C280,139.582,283.582,136,288,136 C292.418,136,296,139.582,296,144 Z"/><path fill="#fffffe" stroke="#000100" d="M224,360 C224,364.418,220.418,368,216,368 C211.582,368,208,364.418,208,360 C208,355.582,211.582,352,216,352 C220.418,352,224,355.582,224,360 Z"/><path fill="#fffffe" stroke="#000100" d="M224,396 C224,400.418,220.418,404,216,404 C211.582,404,208,400.418,208,396 C208,391.582,211.582,388,216,388 C220.418,388,224,391.582,224,396 Z"/><text fill="#000100" font-family="Helvetica" font-weight="bold" font-size="12" text-anchor="middle" transform="matrix(1,0,0,1,216.312,49.5293)" xml:space="preserve"><tspan>Master</tspan><tspan x="0" y="16">(Stable)</tspan></text><g><path fill="none" stroke="#008000" stroke-width="8" d="M288,684 L288,432"/><path fill="#008000" d="M297.625,692.25 L288,684 L278.375,692.25 L278.375,662 L288,653.75 L297.625,662"/></g><path fill="none" stroke="#008000" stroke-width="8" d="M288,432 L288,252"/><path fill="#fffffe" stroke="#000100" d="M296,648 C296,652.418,292.418,656,288,656 C283.582,656,280,652.418,280,648 C280,643.582,283.582,640,288,640 C292.418,640,296,643.582,296,648 Z"/><text fill="#008000" font-family="Helvetica" font-weight="bold" font-size="12" text-anchor="middle" transform="matrix(1,0,0,1,287.841,62.2383)" xml:space="preserve"><tspan>Develop</tspan></text><g><path fill="none" stroke="#f00" stroke-width="8" d="M144.832,612 L144.832,494.125"/><path fill="#f00" d="M133.832,495.5 L144.832,468 L155.832,495.5"/></g><g><path fill="none" stroke="#f00" stroke-width="8" d="M144.832,396 L144.832,206.125"/><path fill="#f00" d="M133.832,207.5 L144.832,180 L155.832,207.5"/></g><text fill="#f00" font-family="Helvetica" font-weight="bold" font-size="12" text-anchor="middle" transform="matrix(1,0,0,1,146.988,142.607)" xml:space="preserve"><tspan>1.1</tspan><tspan x="0" y="16">Release</tspan><tspan x="0" y="32">Branch</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55,615.76)" xml:space="preserve"><tspan>Version 1.</tspan><tspan>0.a1</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55.7734,399.76)" xml:space="preserve"><tspan>Version 1.1.a1</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55,363.76)" xml:space="preserve"><tspan>Version 1.1.a2</tspan></text><path fill="#fffffe" stroke="#000100" d="M152,612 C152,616.418,148.418,620,144,620 C139.582,620,136,616.418,136,612 C136,607.582,139.582,604,144,604 C148.418,604,152,607.582,152,612 Z"/><path fill="#fffffe" stroke="#000100" d="M152,396 C152,400.418,148.418,404,144,404 C139.582,404,136,400.418,136,396 C136,391.582,139.582,388,144,388 C148.418,388,152,391.582,152,396 Z"/><path fill="#fffffe" stroke="#000100" d="M152,360 C152,364.418,148.418,368,144,368 C139.582,368,136,364.418,136,360 C136,355.582,139.582,352,144,352 C148.418,352,152,355.582,152,360 Z"/><path fill="#fffffe" stroke="#000100" d="M152,324 C152,328.418,148.418,332,144,332 C139.582,332,136,328.418,136,324 C136,319.582,139.582,316,144,316 C148.418,316,152,319.582,152,324 Z"/><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55.7734,327.76)" xml:space="preserve"><tspan>Version 1.</tspan><tspan>1.b1</tspan></text><path fill="#fffffe" stroke="#000100" d="M296,612 C296,616.418,292.418,620,288,620 C283.582,620,280,616.418,280,612 C280,607.582,283.582,604,288,604 C292.418,604,296,607.582,296,612 Z"/><path fill="#fffffe" stroke="#000100" d="M296,540 C296,544.418,292.418,548,288,548 C283.582,548,280,544.418,280,540 C280,535.582,283.582,532,288,532 C292.418,532,296,535.582,296,540 Z"/><path fill="#fffffe" stroke="#000100" d="M296,576 C296,580.418,292.418,584,288,584 C283.582,584,280,580.418,280,576 C280,571.582,283.582,568,288,568 C292.418,568,296,571.582,296,576 Z"/><path fill="#fffffe" stroke="#000100" d="M296,467 C296,471.418,292.418,475,288,475 C283.582,475,280,471.418,280,467 C280,462.582,283.582,459,288,459 C292.418,459,296,462.582,296,467 Z"/><path fill="#fffffe" stroke="#000100" d="M296,503 C296,507.418,292.418,511,288,511 C283.582,511,280,507.418,280,503 C280,498.582,283.582,495,288,495 C292.418,495,296,498.582,296,503 Z"/><path fill="#fffffe" stroke="#000100" d="M296,396 C296,400.418,292.418,404,288,404 C283.582,404,280,400.418,280,396 C280,391.582,283.582,388,288,388 C292.418,388,296,391.582,296,396 Z"/><path fill="#fffffe" stroke="#000100" d="M296,432 C296,436.418,292.418,440,288,440 C283.582,440,280,436.418,280,432 C280,427.582,283.582,424,288,424 C292.418,424,296,427.582,296,432 Z"/><path fill="#fffffe" stroke="#000100" d="M296,324 C296,328.418,292.418,332,288,332 C283.582,332,280,328.418,280,324 C280,319.582,283.582,316,288,316 C292.418,316,296,319.582,296,324 Z"/><path fill="#fffffe" stroke="#000100" d="M296,360 C296,364.418,292.418,368,288,368 C283.582,368,280,364.418,280,360 C280,355.582,283.582,352,288,352 C292.418,352,296,355.582,296,360 Z"/><path fill="#fffffe" stroke="#000100" d="M296,251 C296,255.418,292.418,259,288,259 C283.582,259,280,255.418,280,251 C280,246.582,283.582,243,288,243 C292.418,243,296,246.582,296,251 Z"/><path fill="#fffffe" stroke="#000100" d="M296,287 C296,291.418,292.418,295,288,295 C283.582,295,280,291.418,280,287 C280,282.582,283.582,279,288,279 C292.418,279,296,282.582,296,287 Z"/><path fill="#fffffe" stroke="#000100" d="M296,179 C296,183.418,292.418,187,288,187 C283.582,187,280,183.418,280,179 C280,174.582,283.582,171,288,171 C292.418,171,296,174.582,296,179 Z"/><path fill="#fffffe" stroke="#000100" d="M296,215 C296,219.418,292.418,223,288,223 C283.582,223,280,219.418,280,215 C280,210.582,283.582,207,288,207 C292.418,207,296,210.582,296,215 Z"/><g><path fill="none" stroke="#666" stroke-width="4" d="M432,540 L304.625,540"/><path fill="#666" d="M305.5,547 L288,540 L305.5,533"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,504 L304.625,504"/><path fill="#666" d="M305.5,511 L288,504 L305.5,497"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,468 L304.625,468"/><path fill="#666" d="M305.5,475 L288,468 L305.5,461"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,432 L304.625,432"/><path fill="#666" d="M305.5,439 L288,432 L305.5,425"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,396 L304.625,396"/><path fill="#666" d="M305.5,403 L288,396 L305.5,389"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,360 L304.625,360"/><path fill="#666" d="M305.5,367 L288,360 L305.5,353"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,324 L304.625,324"/><path fill="#666" d="M305.5,331 L288,324 L305.5,317"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,288 L304.625,288"/><path fill="#666" d="M305.5,295 L288,288 L305.5,281"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,252 L304.625,252"/><path fill="#666" d="M305.5,259 L288,252 L305.5,245"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,216 L304.625,216"/><path fill="#666" d="M305.5,223 L288,216 L305.5,209"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M404,180 L304.625,180"/><path fill="#666" d="M305.5,187 L288,180 L305.5,173"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,180 L304.625,180"/><path fill="#666" d="M305.5,187 L288,180 L305.5,173"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,144 L304.625,144"/><path fill="#666" d="M305.5,151 L288,144 L305.5,137"/></g><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,535)" xml:space="preserve"><tspan>Patch Email (Patchwork)</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,499)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,463)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,427)" xml:space="preserve"><tspan>Patch Email (Patchwork)</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,391)" xml:space="preserve"><tspan>Patch Email (Patchwork)</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,355)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,319)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,283)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,247)" xml:space="preserve"><tspan>Patch Email (Patchwork)</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,211)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,175)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,139)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,607)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,571)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,324,571)" xml:space="preserve"><tspan>Github Pull Request</tspan></text><g><path fill="none" stroke="#666" stroke-width="4" d="M432,612 L304.28,612"/><path fill="#666" d="M305.155,619 L287.655,612 L305.155,605"/></g><g><path fill="none" stroke="#666" stroke-width="4" d="M432,576 L304.625,576"/><path fill="#666" d="M305.5,583 L288,576 L305.5,569"/></g><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,56,581)" xml:space="preserve"><tspan>Version 1.</tspan><tspan>0.a2</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,56,545)" xml:space="preserve"><tspan>Version 1.</tspan><tspan>0.b1</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,56,509)" xml:space="preserve"><tspan>Version 1.</tspan><tspan>0.0</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55.7734,292.76)" xml:space="preserve"><tspan>Version 1.1.0</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55,256.76)" xml:space="preserve"><tspan>Version 1.1.1</tspan></text><text fill="#000100" font-family="Helvetica" font-size="12" transform="matrix(1,0,0,1,55.7734,220.76)" xml:space="preserve"><tspan>Version 1.</tspan><tspan>1.2</tspan></text><path fill="none" stroke="#f00" stroke-width="8" d="M216,612 L144,576"/><path fill="none" stroke="#f00" stroke-width="8" d="M216,576 L144,540"/><path fill="none" stroke="#f00" stroke-width="8" d="M216,540 L144,504"/><path fill="none" stroke="#f00" stroke-width="8" d="M216,324 L144,288"/><path fill="none" stroke="#f00" stroke-width="8" d="M216,288 L144,252"/><path fill="none" stroke="#f00" stroke-width="8" d="M216,252 L144,216"/><path fill="#fffffe" stroke="#000100" d="M152,575 C152,579.418,148.418,583,144,583 C139.582,583,136,579.418,136,575 C136,570.582,139.582,567,144,567 C148.418,567,152,570.582,152,575 Z"/><path fill="#fffffe" stroke="#000100" d="M152,539 C152,543.418,148.418,547,144,547 C139.582,547,136,543.418,136,539 C136,534.582,139.582,531,144,531 C148.418,531,152,534.582,152,539 Z"/><path fill="#fffffe" stroke="#000100" d="M152,503 C152,507.418,148.418,511,144,511 C139.582,511,136,507.418,136,503 C136,498.582,139.582,495,144,495 C148.418,495,152,498.582,152,503 Z"/><path fill="#fffffe" stroke="#000100" d="M152,288 C152,292.418,148.418,296,144,296 C139.582,296,136,292.418,136,288 C136,283.582,139.582,280,144,280 C148.418,280,152,283.582,152,288 Z"/><path fill="#fffffe" stroke="#000100" d="M152,252 C152,256.418,148.418,260,144,260 C139.582,260,136,256.418,136,252 C136,247.582,139.582,244,144,244 C148.418,244,152,247.582,152,252 Z"/><path fill="#fffffe" stroke="#000100" d="M152,216 C152,220.418,148.418,224,144,224 C139.582,224,136,220.418,136,216 C136,211.582,139.582,208,144,208 C148.418,208,152,211.582,152,216 Z"/><path fill="#fffffe" stroke="#000100" d="M224,576 C224,580.418,220.418,584,216,584 C211.582,584,208,580.418,208,576 C208,571.582,211.582,568,216,568 C220.418,568,224,571.582,224,576 Z"/><path fill="#fffffe" stroke="#000100" d="M224,540 C224,544.418,220.418,548,216,548 C211.582,548,208,544.418,208,540 C208,535.582,211.582,532,216,532 C220.418,532,224,535.582,224,540 Z"/><path fill="#fffffe" stroke="#000100" d="M224,324 C224,328.418,220.418,332,216,332 C211.582,332,208,328.418,208,324 C208,319.582,211.582,316,216,316 C220.418,316,224,319.582,224,324 Z"/><path fill="#fffffe" stroke="#000100" d="M224,252 C224,256.418,220.418,260,216,260 C211.582,260,208,256.418,208,252 C208,247.582,211.582,244,216,244 C220.418,244,224,247.582,224,252 Z"/><path fill="#fffffe" stroke="#000100" d="M224,288 C224,292.418,220.418,296,216,296 C211.582,296,208,292.418,208,288 C208,283.582,211.582,280,216,280 C220.418,280,224,283.582,224,288 Z"/></svg>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="52 37 349.25195 651.46875"
+ width="349.25195"
+ height="651.46875"
+ id="svg2"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="git_branches.svg">
+ <metadata
+ id="metadata376">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs374" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1596"
+ inkscape:window-height="848"
+ id="namedview372"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="0.89517435"
+ inkscape:cx="53.149337"
+ inkscape:cy="353.95197"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <g
+ id="g12"
+ transform="translate(-3.09375,-3.7812531)">
+ <path
+ d="M 216,98.125 216,684"
+ id="path14"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#000100;stroke-width:8" />
+ <path
+ d="M 205,99.5 216,72 227,99.5"
+ id="path16"
+ inkscape:connector-curvature="0"
+ style="fill:#000100" />
+ <path
+ d="M 225.625,692.25 216,684 l -9.625,8.25 0,-30.25 9.625,-8.25 9.625,8.25"
+ id="path18"
+ inkscape:connector-curvature="0"
+ style="fill:#000100" />
+ </g>
+ <path
+ d="m 212.90625,644.21875 -72,-36"
+ id="path20"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.90625,428.21875 -72,-36"
+ id="path22"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <text
+ font-weight="bold"
+ font-size="12"
+ xml:space="preserve"
+ id="text30"
+ style="font-weight:bold;font-size:12px;font-family:Helvetica;text-anchor:middle;fill:#ff0000"
+ x="143.89426"
+ y="427.82574"><tspan
+ id="tspan32">1.0</tspan><tspan
+ x="143.89426"
+ y="443.82574"
+ id="tspan34">Release</tspan><tspan
+ x="143.89426"
+ y="459.82574"
+ id="tspan36">Branch</tspan></text>
+ <path
+ d="m 213.73825,392.21875 -72.832,-36"
+ id="path42"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.73825,356.21875 -71.832,-36"
+ id="path44"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 220.90625,644.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path46"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,464.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path48"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,428.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path50"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,608.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path52"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,140.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path54"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,356.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path58"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,392.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path60"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <text
+ font-weight="bold"
+ font-size="12"
+ xml:space="preserve"
+ id="text62"
+ style="font-weight:bold;font-size:12px;font-family:Helvetica;text-anchor:middle;fill:#000100"
+ x="213.21825"
+ y="45.748047"><tspan
+ id="tspan64">Master</tspan><tspan
+ x="213.21825"
+ y="61.748047"
+ id="tspan66">(Stable)</tspan></text>
+ <g
+ id="g82"
+ transform="translate(-3.09375,-3.7812531)">
+ <path
+ d="m 144.832,612 0,-117.875"
+ id="path84"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 133.832,495.5 11,-27.5 11,27.5"
+ id="path86"
+ inkscape:connector-curvature="0"
+ style="fill:#ff0000" />
+ </g>
+ <g
+ id="g88"
+ transform="translate(-3.09375,-3.7812531)">
+ <path
+ d="m 144.832,396 0,-189.875"
+ id="path90"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 133.832,207.5 11,-27.5 11,27.5"
+ id="path92"
+ inkscape:connector-curvature="0"
+ style="fill:#ff0000" />
+ </g>
+ <text
+ font-weight="bold"
+ font-size="12"
+ xml:space="preserve"
+ id="text94"
+ style="font-weight:bold;font-size:12px;font-family:Helvetica;text-anchor:middle;fill:#ff0000"
+ x="143.89426"
+ y="138.82574"><tspan
+ id="tspan96">1.1</tspan><tspan
+ x="143.89426"
+ y="154.82574"
+ id="tspan98">Release</tspan><tspan
+ x="143.89426"
+ y="170.82574"
+ id="tspan100">Branch</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text102"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="51.90625"
+ y="611.97876"><tspan
+ id="tspan104">Version 1.</tspan><tspan
+ id="tspan106">0.a1</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text108"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.679649"
+ y="395.97876"><tspan
+ id="tspan110">Version 1.1.a1</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text112"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="51.90625"
+ y="359.97876"><tspan
+ id="tspan114">Version 1.1.a2</tspan></text>
+ <path
+ d="m 148.90625,608.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path116"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,392.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path118"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,356.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path120"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,320.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path122"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text124"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.679649"
+ y="323.97876"><tspan
+ id="tspan126">Version 1.</tspan><tspan
+ id="tspan128">1.b1</tspan></text>
+ <g
+ id="g156"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,540 -127.375,0"
+ id="path158"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,547 -17.5,-7 17.5,-7"
+ id="path160"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g162"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,504 -127.375,0"
+ id="path164"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,511 -17.5,-7 17.5,-7"
+ id="path166"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g168"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,468 -127.375,0"
+ id="path170"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,475 -17.5,-7 17.5,-7"
+ id="path172"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g174"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,432 -127.375,0"
+ id="path176"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,439 -17.5,-7 17.5,-7"
+ id="path178"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g180"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,396 -127.375,0"
+ id="path182"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,403 -17.5,-7 17.5,-7"
+ id="path184"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g186"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,360 -127.375,0"
+ id="path188"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,367 -17.5,-7 17.5,-7"
+ id="path190"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g192"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,324 -127.375,0"
+ id="path194"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,331 -17.5,-7 17.5,-7"
+ id="path196"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g198"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,288 -127.375,0"
+ id="path200"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,295 -17.5,-7 17.5,-7"
+ id="path202"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g204"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,252 -127.375,0"
+ id="path206"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,259 -17.5,-7 17.5,-7"
+ id="path208"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g210"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,216 -127.375,0"
+ id="path212"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,223 -17.5,-7 17.5,-7"
+ id="path214"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g216"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 404,180 -99.375,0"
+ id="path218"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,187 -17.5,-7 17.5,-7"
+ id="path220"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g222"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,180 -127.375,0"
+ id="path224"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,187 -17.5,-7 17.5,-7"
+ id="path226"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g228"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,144 -127.375,0"
+ id="path230"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,151 -17.5,-7 17.5,-7"
+ id="path232"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text234"
+ x="256.90625"
+ y="531.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan236">Patch Email (Patchwork)</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text238"
+ x="256.90625"
+ y="495.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan240">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text242"
+ x="256.90625"
+ y="459.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan244">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text246"
+ x="256.90625"
+ y="423.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan248">Patch Email (Patchwork)</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text250"
+ x="256.90625"
+ y="387.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan252">Patch Email (Patchwork)</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text254"
+ x="256.90625"
+ y="351.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan256">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text258"
+ x="256.90625"
+ y="315.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan260">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text262"
+ x="256.90625"
+ y="279.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan264">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text266"
+ x="256.90625"
+ y="243.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan268">Patch Email (Patchwork)</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text270"
+ x="256.90625"
+ y="207.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan272">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text274"
+ x="256.90625"
+ y="171.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan276">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text278"
+ x="256.90625"
+ y="135.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan280">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text282"
+ x="256.90625"
+ y="603.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan284">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text286"
+ x="256.90625"
+ y="567.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan288">Github Pull Request</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text290"
+ x="256.90625"
+ y="567.21875"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"><tspan
+ id="tspan292">Github Pull Request</tspan></text>
+ <g
+ id="g294"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,612 -127.72,0"
+ id="path296"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.155,619 -17.5,-7 17.5,-7"
+ id="path298"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <g
+ id="g300"
+ transform="translate(-67.09375,-3.7812531)">
+ <path
+ d="m 432,576 -127.375,0"
+ id="path302"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#666666;stroke-width:4" />
+ <path
+ d="m 305.5,583 -17.5,-7 17.5,-7"
+ id="path304"
+ inkscape:connector-curvature="0"
+ style="fill:#666666" />
+ </g>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text306"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.90625"
+ y="577.21875"><tspan
+ id="tspan308">Version 1.</tspan><tspan
+ id="tspan310">0.a2</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text312"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.90625"
+ y="541.21875"><tspan
+ id="tspan314">Version 1.</tspan><tspan
+ id="tspan316">0.b1</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text318"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.90625"
+ y="505.21875"><tspan
+ id="tspan320">Version 1.</tspan><tspan
+ id="tspan322">0.0</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text324"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.679649"
+ y="288.97876"><tspan
+ id="tspan326">Version 1.1.0</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text328"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="51.90625"
+ y="252.97874"><tspan
+ id="tspan330">Version 1.1.1</tspan></text>
+ <text
+ font-size="12"
+ xml:space="preserve"
+ id="text332"
+ style="font-size:12px;font-family:Helvetica;fill:#000100"
+ x="52.679649"
+ y="216.97874"><tspan
+ id="tspan334">Version 1.</tspan><tspan
+ id="tspan336">1.2</tspan></text>
+ <path
+ d="m 212.90625,608.21875 -72,-36"
+ id="path338"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.90625,572.21875 -72,-36"
+ id="path340"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.90625,536.21875 -72,-36"
+ id="path342"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.90625,320.21875 -72,-36"
+ id="path344"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.90625,284.21875 -72,-36"
+ id="path346"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 212.90625,248.21875 -72,-36"
+ id="path348"
+ inkscape:connector-curvature="0"
+ style="fill:none;stroke:#ff0000;stroke-width:8" />
+ <path
+ d="m 148.90625,571.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path350"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,535.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path352"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,499.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path354"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,284.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path356"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,248.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path358"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 148.90625,212.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path360"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,572.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path362"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,536.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path364"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,320.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path366"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,248.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path368"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+ <path
+ d="m 220.90625,284.21875 c 0,4.418 -3.582,8 -8,8 -4.418,0 -8,-3.582 -8,-8 0,-4.418 3.582,-8 8,-8 4.418,0 8,3.582 8,8 z"
+ id="path370"
+ inkscape:connector-curvature="0"
+ style="fill:#fffffe;stroke:#000100" />
+</svg>
@chapter Overview
@cindex Overview
- @uref{http://www.freerangerouting.org,,Frr} is a routing software package that
+ @uref{http://www.frrouting.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
The official Frr web-site is located at:
-@uref{http://www.freerangerouting.org/}
+@uref{http://www.frrouting.org/}
and contains further information, as well as links to additional
resources.
-@uref{http://www.freerangerouting.org/,Frr} is a fork of Quagga, whose
+@uref{http://www.frrouting.org/,Frr} is a fork of Quagga, whose
web-site is located at:
@uref{http://www.quagga.net/}.
@uref{http://lists.nox.tf/listinfo/frr-users}.
-The @uref{http://www.freerangerouting.org/,,Frr} site has further information on
+The @uref{http://www.frrouting.org/,,Frr} site has further information on
the available mailing lists, see:
@uref{http://lists.nox.tf/lists.php}
If you think you have found a bug, please send a bug report to:
-@uref{http://github.com/freerangerouting/frr/issues}
+@uref{http://github.com/frrouting/frr/issues}
When you send a bug report, please be careful about the points below.
Bug reports are very important for us to improve the quality of Frr.
Frr is still in the development stage, but please don't hesitate to
-send a bug report to @uref{http://github.com/freerangerouting/frr/issues}.
+send a bug report to @uref{http://github.com/frrouting/frr/issues}.
#include "vrf.h"
#include "command_match.h"
#include "qobj.h"
+#include "defaults.h"
DEFINE_MTYPE( LIB, HOST, "Host config")
DEFINE_MTYPE( LIB, STRVEC, "String vector")
return CMD_SUCCESS;
}
+/* "Set" version ... ignore version tags */
+DEFUN (frr_version_defaults,
+ frr_version_defaults_cmd,
+ "frr <version|defaults> LINE...",
+ "FRRouting global parameters\n"
+ "version configuration was written by\n"
+ "set of configuration defaults used\n"
+ "version string\n")
+{
+ if (vty->type == VTY_TERM || vty->type == VTY_SHELL)
+ /* only print this when the user tries to do run it */
+ vty_out (vty, "%% NOTE: This command currently does nothing.%s"
+ "%% It is written to the configuration for future reference.%s",
+ VTY_NEWLINE, VTY_NEWLINE);
+ return CMD_SUCCESS;
+}
+
/* Help display function for all node. */
DEFUN (config_help,
config_help_cmd,
return cmd_list_cmds (vty, argc == 3);
}
+static void
+vty_write_config (struct vty *vty)
+{
+ size_t i;
+ struct cmd_node *node;
+
+ if (vty->type == VTY_TERM)
+ {
+ vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,
+ VTY_NEWLINE);
+ vty_out (vty, "!%s", VTY_NEWLINE);
+ }
+
+ vty_out (vty, "frr version %s%s", FRR_VER_SHORT, VTY_NEWLINE);
+ vty_out (vty, "frr defaults %s%s", DFLT_NAME, VTY_NEWLINE);
+ vty_out (vty, "!%s", VTY_NEWLINE);
+
+ for (i = 0; i < vector_active (cmdvec); i++)
+ if ((node = vector_slot (cmdvec, i)) && node->func
+ && (node->vtysh || vty->type != VTY_SHELL))
+ {
+ if ((*node->func) (vty))
+ vty_out (vty, "!%s", VTY_NEWLINE);
+ }
+
+ if (vty->type == VTY_TERM)
+ {
+ vty_out (vty, "end%s",VTY_NEWLINE);
+ }
+}
+
/* Write current configuration into file. */
DEFUN (config_write,
"Write configuration to terminal\n")
{
int idx_type = 1;
- unsigned int i;
int fd, dirfd;
- struct cmd_node *node;
char *config_file, *slash;
char *config_file_tmp = NULL;
char *config_file_sav = NULL;
// if command was 'write terminal' or 'show running-config'
if (argc == 2 && (!strcmp(argv[idx_type]->text, "terminal") ||
!strcmp(argv[0]->text, "show")))
- {
- if (vty->type == VTY_SHELL_SERV)
- {
- for (i = 0; i < vector_active (cmdvec); i++)
- if ((node = vector_slot (cmdvec, i)) && node->func && node->vtysh)
- {
- if ((*node->func) (vty))
- vty_out (vty, "!%s", VTY_NEWLINE);
- }
- }
- else
- {
- vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,
- VTY_NEWLINE);
- vty_out (vty, "!%s", VTY_NEWLINE);
-
- for (i = 0; i < vector_active (cmdvec); i++)
- if ((node = vector_slot (cmdvec, i)) && node->func)
- {
- if ((*node->func) (vty))
- vty_out (vty, "!%s", VTY_NEWLINE);
- }
- vty_out (vty, "end%s",VTY_NEWLINE);
- }
- return CMD_SUCCESS;
- }
+ {
+ vty_write_config (vty);
+ return CMD_SUCCESS;
+ }
if (host.noconfig)
return CMD_SUCCESS;
vty_out (file_vty, "!\n! Zebra configuration saved from vty\n! ");
vty_time_print (file_vty, 1);
vty_out (file_vty, "!\n");
-
- for (i = 0; i < vector_active (cmdvec); i++)
- if ((node = vector_slot (cmdvec, i)) && node->func)
- {
- if ((*node->func) (file_vty))
- vty_out (file_vty, "!\n");
- }
+ vty_write_config (file_vty);
vty_close (file_vty);
if (stat(config_file, &conf_stat) >= 0)
"Copy running config to... \n"
"Copy running config to startup config (same as write file)\n")
{
- return config_write (self, vty, argc, argv);
+ if (!host.noconfig)
+ vty_write_config (vty);
+ return CMD_SUCCESS;
}
/** -- **/
install_element (CONFIG_NODE, &hostname_cmd);
install_element (CONFIG_NODE, &no_hostname_cmd);
+ install_element (CONFIG_NODE, &frr_version_defaults_cmd);
if (terminal > 0)
{
if (zprivs->user)
{
ngroups = sizeof(groups);
- if ( (ngroups = getgrouplist (zprivs->user, zprivs_state.zgid, groups, &ngroups )) < 0 )
+ if (getgrouplist (zprivs->user, zprivs_state.zgid, groups, &ngroups) < 0)
{
/* cant use log.h here as it depends on vty */
fprintf (stderr, "privs_init: could not getgrouplist for user %s\n",
#define FRR_SMUX_NAME "@PACKAGE_NAME@"
#define FRR_PTM_NAME "@PACKAGE_NAME@"
-#define FRR_FULL_NAME "FreeRangeRouting"
+#define FRR_FULL_NAME "FRRouting"
#define FRR_VERSION "@PACKAGE_VERSION@" GIT_SUFFIX
+#define FRR_VER_SHORT "@PACKAGE_VERSION@"
#define FRR_BUG_ADDRESS "@PACKAGE_BUGREPORT@"
#define FRR_COPYRIGHT "Copyright 1996-2005 Kunihiro Ishiguro, et al."
#define FRR_CONFIG_ARGS "@CONFIG_ARGS@"
#include "table.h"
#include "thread.h"
#include "command.h"
+#include "defaults.h"
#include "ospf6_proto.h"
#include "ospf6_message.h"
o->distance_table = route_table_init ();
/* Enable "log-adjacency-changes" */
+#if DFLT_OSPF6_LOG_ADJACENCY_CHANGES
SET_FLAG(o->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
+#endif
+
QOBJ_REG (o, ospf6);
return o;
VTY_DECLVAR_CONTEXT(ospf6, ospf6);
UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
- UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
return CMD_SUCCESS;
}
{
if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL))
vty_out(vty, " log-adjacency-changes detail%s", VTY_NEWLINE);
+ else if (!DFLT_OSPF6_LOG_ADJACENCY_CHANGES)
+ vty_out(vty, " log-adjacency-changes%s", VTY_NEWLINE);
}
- else
+ else if (DFLT_OSPF6_LOG_ADJACENCY_CHANGES)
{
vty_out(vty, " no log-adjacency-changes%s", VTY_NEWLINE);
}
* OSPFd dump routine (parts used by ospfclient).
* Copyright (C) 1999, 2000 Toshiaki Takada
*
- * This file is part of FreeRangeRouting (FRR).
+ * This file is part of FRRouting (FRR).
*
* FRR is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* OSPFd dump routine (parts used by ospfclient).
* Copyright (C) 1999 Toshiaki Takada
*
- * This file is part of FreeRangeRouting (FRR).
+ * This file is part of FRRouting (FRR).
*
* FRR is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
#include "log.h"
#include "zclient.h"
#include <lib/json.h>
+#include "defaults.h"
#include "ospfd/ospfd.h"
#include "ospfd/ospf_asbr.h"
{
VTY_DECLVAR_CONTEXT(ospf, ospf);
- UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
return CMD_SUCCESS;
}
{
if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
vty_out(vty, " log-adjacency-changes detail%s", VTY_NEWLINE);
+ else if (!DFLT_OSPF_LOG_ADJACENCY_CHANGES)
+ vty_out(vty, " log-adjacency-changes%s", VTY_NEWLINE);
}
- else
+ else if (DFLT_OSPF_LOG_ADJACENCY_CHANGES)
{
vty_out(vty, " no log-adjacency-changes%s", VTY_NEWLINE);
}
#include "plist.h"
#include "sockopt.h"
#include "bfd.h"
+#include "defaults.h"
#include "ospfd/ospfd.h"
#include "ospfd/ospf_network.h"
new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
/* Enable "log-adjacency-changes" */
+#if DFLT_OSPF_LOG_ADJACENCY_CHANGES
SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
+#endif
+
QOBJ_REG (new, ospf);
return new;
-Building your own FreeRangeRouting RPM
+Building your own FRRouting RPM
======================================
(Tested on CentOS 6, CentOS 7 and Fedora 22.)
2. Checkout FRR under a **unpriviledged** user account
- git clone https://github.com/freerangerouting/frr.git frr
+ git clone https://github.com/frrouting/frr.git frr
3. Run Bootstrap and make distribution tar.gz
# rpms again and again on the same day, so the newer rpms can be installed.
# bumping the number each time.
-####################### FreeRangeRouting (FRR) configure options #########################
+####################### FRRouting (FRR) configure options #########################
# with-feature options
%{!?with_tcp_zebra: %global with_tcp_zebra 0 }
%{!?with_pam: %global with_pam 0 }
Release: @CONFDATE@%{release_rev}%{?dist}
License: GPLv2+
Group: System Environment/Daemons
-Source0: http://www.freerangerouting.org/releases/frr/%{name}-%{frrversion}.tar.gz
-URL: http://www.freerangerouting.org
+Source0: http://www.frrouting.org/releases/frr/%{name}-%{frrversion}.tar.gz
+URL: http://www.frrouting.org
Requires: ncurses json-c
Requires(pre): /sbin/install-info
Requires(preun): /sbin/install-info
Obsoletes: bird gated mrt zebra frr-sysvinit
%description
-FreeRangeRouting is a free software that manages TCP/IP based routing
+FRRouting is a free software that manages TCP/IP based routing
protocol. It takes multi-server and multi-thread approach to resolve
the current complexity of the Internet.
-FreeRangeRouting supports BGP4, OSPFv2, OSPFv3, ISIS, RIP, RIPng, PIM,
-LDP and NHRP.
+FRRouting supports BGP4, OSPFv2, OSPFv3, ISIS, RIP, RIPng, PIM, LDP
+and NHRP.
-FreeRangeRouting is a fork of Quagga.
+FRRouting is a fork of Quagga.
%package contrib
Summary: contrib tools for frr
fi
if getent passwd %frr_user >/dev/null ; then : ; else \
/usr/sbin/useradd -u %frr_uid -g %frr_gid \
- -M -r -s /sbin/nologin -c "FreeRangeRouting suite" \
+ -M -r -s /sbin/nologin -c "FRRouting suite" \
-d %_localstatedir %frr_user 2> /dev/null || : ; \
fi
%if 0%{?vty_group:1}
* Tue Feb 14 2017 Timo Teräs <timo.teras@iki.fi> - %{version}
- add nhrpd
-* Fri Jan 6 2017 Martin Winter <mwinter@opensourcerouting.org>
-- Renamed to frr for FreeRangeRouting fork of Quagga
+* Fri Jan 6 2017 Martin Winter <mwinter@opensourcerouting.org> - %{version}
+- Renamed to frr for FRRouting fork of Quagga
* Thu Feb 11 2016 Paul Jakma <paul@jakma.org>
- remove with_ipv6 conditionals, always build v6
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
+ README.snap_build.md \
+ README.usage.md \
+ scripts/Makefile \
+ scripts/bgpd-service \
+ scripts/isisd-service \
+ scripts/ldpd-service \
+ scripts/ospf6d-service \
+ scripts/ospfd-service \
+ scripts/pimd-service \
+ scripts/ripd-service \
+ scripts/ripngd-service \
+ scripts/zebra-service \
+ defaults/bgpd.conf.default \
+ defaults/isisd.conf.default \
+ defaults/ldpd.conf.default \
+ defaults/ospf6d.conf.default \
+ defaults/ospfd.conf.default \
+ defaults/pimd.conf.default \
+ defaults/ripd.conf.default \
+ defaults/ripngd.conf.default \
+ defaults/vtysh.conf.default \
+ defaults/zebra.conf.default \
+ helpers \
+ snap
-Building your own FreeRangeRouting Snap
+Building your own FRRouting Snap
========================================
(Tested on Ubuntu 16.04 with Snap Version 2, does not work on Ubuntu 15.x
which uses earlier versions of snaps)
sudo apt-get install snapcraft
-2. Checkout FreeRangeRouting under a **unpriviledged** user account
+2. Checkout FRRouting under a **unpriviledged** user account
- git clone https://github.com/freerangerouting/frr.git
+ git clone https://github.com/frrouting/frr.git
cd frr
3. Run Bootstrap and make distribution tar.gz
Operations
==========
-### FreeRangeRouting Daemons
-At this time, all FreeRangeRouting daemons are auto-started.
+### FRRouting Daemons
+At this time, all FRRouting daemons are auto-started.
A daemon can be stopped/started with (ie ospf6d)
systemctl disable snap.frr.ospf6d.service
systemctl enable snap.frr.ospf6d.service
-### FreeRangeRouting Commands
+### FRRouting Commands
All the commands are prefixed with frr.
frr.vtysh -> vtysh
-Using the FreeRangeRouting Snap
+Using the FRRouting 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
+Enabling/Disabling FRRouting Daemons
-------------------------------------------
-By default (at this time), all FreeRangeRouting daemons will be enabled
+By default (at this time), all FRRouting daemons will be enabled
on installation. If you want to disable a specific daemon, then use
the systemctl commands
-----------------------------
- `frr.vtysh`:
- FreeRangeRouting VTY Shell (configuration tool)
+ FRRouting VTY Shell (configuration tool)
- `frr.version`:
Returns output of `zebra --version` to display version and configured
options
Sourcecode available
====================
-The source for this SNAP is available as part of the FreeRangeRouting
+The source for this SNAP is available as part of the FRRouting
Source Code Distribution.
- https://github.com/freerangerouting/frr.git
+ https://github.com/frrouting/frr.git
Instructions for rebuilding the snap are in `README.snap_build.md`
name: frr
version: @VERSION@
-summary: FreeRangeRouting BGP/OSPFv2/OSPFv3/ISIS/RIP/RIPng/PIM/LDP routing daemon
+summary: FRRouting 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
+ FRRouting (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.
+ FRRouting (frr) is a fork of Quagga.
confinement: strict
grade: devel
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 FreeRangeRouting source.
+ these scripts), or in the solaris/ directory in the FRRouting source.
Package creation instructions:
------------------------------
-1. Configure and build FreeRangeRouting (frr) in the top level build directory as per normal, eg:
+1. Configure and build FRRouting (frr) in the top level build directory as per normal, eg:
./configure --prefix=/usr/local/frr \
--localstatedir=/var/run/frr \
# # svcs -l ripd
fmri svc:/network/routing/frr:ripd
- name FreeRangeRouting: ripd, RIPv1/2 IPv4 routing protocol daemon.
+ name FRRouting: ripd, RIPv1/2 IPv4 routing protocol daemon.
enabled true
state online
next_state none
- Configuration of startup options is by way of SMF properties in a
property group named 'frr'. The defaults should automatically be
- inline with how you configured FreeRangeRouting in Step 1 above.
+ inline with how you configured FRRouting in Step 1 above.
- By default the VTY interface is disabled. To change this, see below for
how to set the 'frr/vty_port' property as appropriate for
- As SMF is dependency aware, restarting network/zebra will restart all the
other daemons.
- - To upgrade from one set of FreeRangeRouting packages to a newer release,
+ - To upgrade from one set of FRRouting 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 FRRsmf package.
- These packages are not supported by Sun Microsystems, report bugs via the
- usual FreeRangeRouting channels, ie Issue Tracker. Improvements/contributions of course would be greatly appreciated.
+ usual FRRouting channels, ie Issue Tracker. Improvements/contributions of course would be greatly appreciated.
-P FRRlibs FreeRangeRouting common runtime libraries
+P FRRlibs FRRouting common runtime libraries
@PACKAGE_VERSION@,REV=@CONFDATE@
P SUNWcsu Core Solaris, (Usr)
P SUNWcsr Core Solaris Libraries (Root)
-P FRRlibs FreeRangeRouting common runtime libraries
+P FRRlibs FRRouting common runtime libraries
@PACKAGE_VERSION@,REV=@CONFDATE@
P SUNWcslr Core Solaris Libraries (Root)
P SUNWcsl Core Solaris, (Shared Libs)
P SUNWlibmsr Math & Microtasking Libraries (Root)
-R FRRdaemons FreeRangeRouting daemons
+R FRRdaemons FRRouting daemons
R FRRdev
-P FRRaemons FreeRangeRouting daemons
+P FRRaemons FRRouting daemons
@PACKAGE_VERSION@,REV=@CONFDATE@
P SUNWcsu Core Solaris, (Usr)
P SUNWcsr Core Solaris Libraries (Root)
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# This file is part of FreeRangeRouting.
+# This file is part of FRRouting.
#
-# FreeRangeRouting is free software; you can redistribute it and/or modify
+# FRRouting 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 distributed in the hope that it will be useful, but
+# FRRouting 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 FreeRangeRouting; see the file COPYING. If not, write to
+# along with FRRouting; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
upgrade_config () {
DAEMON=$1
- # handle upgrade of SUNWzebra to FreeRangeRouting
+ # handle upgrade of SUNWzebra to FRRouting
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" \
;;
esac
-# Older FreeRangeRouting SMF packages pass daemon args on the commandline
+# Older FRRouting 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
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
- This file is part of FreeRangeRouting (FRR)
+ This file is part of FRRouting (FRR)
- FreeRangeRouting is free software; you can redistribute it and/or
+ FRRouting 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.
- FreeRangeRouting is distributed in the hope that it will be useful,
+ FRRouting 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 FreeRangeRouting; see the file COPYING. If not, write to
+ along with FRRouting; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
<propval name='value_authorization' type='astring'
value='solaris.smf.value.routing' />
- <!-- Options common to FreeRangeRouting daemons
+ <!-- Options common to FRRouting daemons
Property names are equivalent to the long
- option name, consult FreeRangeRouting documentation -->
+ option name, consult FRRouting 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.
<template>
<common_name>
<loctext xml:lang='C'>
- FreeRangeRouting: zebra, RIB, kernel intermediary and misc daemon
+ FRRouting: zebra, RIB, kernel intermediary and misc daemon
</loctext>
</common_name>
<documentation>
<manpage title='zebra' section='1M'
manpath='@mandir@' />
- <doc_link name='freerangerouting.org'
- uri='http://www.freerangerouting.org/' />
+ <doc_link name='frrouting.org'
+ uri='http://www.frrouting.org/' />
</documentation>
</template>
</instance>
<propval name='value_authorization' type='astring'
value='solaris.smf.value.routing' />
- <!-- Options common to FreeRangeRouting daemons -->
+ <!-- Options common to FRRouting 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.
<template>
<common_name>
<loctext xml:lang='C'>
- FreeRangeRouting: ripd, RIPv1/2 IPv4 routing protocol daemon.
+ FRRouting: ripd, RIPv1/2 IPv4 routing protocol daemon.
</loctext>
</common_name>
<documentation>
<manpage title='ripd' section='1M'
manpath='@mandir@' />
- <doc_link name='freerangerouting.org'
- uri='http://www.freerangerouting.org/' />
+ <doc_link name='frrouting.org'
+ uri='http://www.frrouting.org/' />
</documentation>
</template>
</instance>
<documentation>
<manpage title='ripngd' section='1M'
manpath='@mandir@' />
- <doc_link name='freerangerouting.org'
- uri='http://www.freerangerouting.org/' />
+ <doc_link name='frrouting.org'
+ uri='http://www.frrouting.org/' />
</documentation>
</template>
</instance>
<documentation>
<manpage title='ospfd' section='1M'
manpath='@mandir@' />
- <doc_link name='freerangerouting.org'
- uri='http://www.freerangerouting.org/' />
+ <doc_link name='frrouting.org'
+ uri='http://www.frrouting.org/' />
</documentation>
</template>
</instance>
<documentation>
<manpage title='ospf6d' section='1M'
manpath='@mandir@' />
- <doc_link name='freerangerouting.org'
- uri='http://www.freerangerouting.org/' />
+ <doc_link name='frrouting.org'
+ uri='http://www.frrouting.org/' />
</documentation>
</template>
</instance>
<documentation>
<manpage title='bgpd' section='1M'
manpath='@mandir@' />
- <doc_link name='freerangerouting.org'
- uri='http://www.freerangerouting.org/' />
+ <doc_link name='frrouting.org'
+ uri='http://www.frrouting.org/' />
</documentation>
</template>
</instance>
ARCH="@target_cpu@"
CATEGORY="system"
VERSION="@PACKAGE_VERSION@,REV=@CONFDATE@"
-VENDOR="http://www.freerangerouting.org/"
+VENDOR="http://www.frrouting.org/"
HOTLINE="@PACKAGE_BUGREPORT@"
-EMAIL=maintainers@freerangerouting.org
+EMAIL=maintainers@frrouting.org
DESC="@PACKAGE_NAME@ Routing Protocols"
MAXINST=1
CLASSES="none preserve renamenew manifest"
# Copyright (C) 2017 by David Lamparter & Christian Franke,
# Open Source Routing / NetDEF Inc.
#
-# This file is part of FreeRangeRouting (FRR)
+# This file is part of FRRouting (FRR)
#
# FRR is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
import re
import inspect
import os
+import difflib
import frrsix
#
class TestRefMismatch(Exception):
- pass
+ def __init__(self, _test, outtext, reftext):
+ self.outtext = outtext.decode('utf8') if type(outtext) is bytes else outtext
+ self.reftext = reftext.decode('utf8') if type(reftext) is bytes else reftext
+
+ def __str__(self):
+ rv = 'Expected output and actual output differ:\n'
+ rv += '\n'.join(difflib.unified_diff(self.reftext.splitlines(),
+ self.outtext.splitlines(),
+ 'outtext', 'reftext',
+ lineterm=''))
+ return rv
+
class TestExitNonzero(Exception):
pass
--- /dev/null
+/test_cli.refout
+++ /dev/null
-test# echo this is a test message\r
-this is a test message\r
-test# echo foo bla \r
-% There is no matched command.\r
-test# echo foo bla baz\r
-foo bla baz\r
-test# echo\r
-% Command incomplete.\r
-test# \r
-test# arg ipv4 1.2.3.4\r
-cmd0 with 3 args.\r
-[00]: arg\r
-[01]: ipv4\r
-[02]: 1.2.3.4\r
-test# arg ipv4 1.2.\r
- A.B.C.D 02\r
-test# arg ipv4 1.2.3.4\r
-cmd0 with 3 args.\r
-[00]: arg\r
-[01]: ipv4\r
-[02]: 1.2.3.4\r
-test# arg ipv4 1.2.3\r
-% [NONE] Unknown command: arg ipv4 1.2.3\r
-test# arg ipv4 1.2.3.4.5\r
-% [NONE] Unknown command: arg ipv4 1.2.3.4.5\r
-test# arg ipv4 1.a.3.4\r
-% [NONE] Unknown command: arg ipv4 1.a.3.4\r
-test# arg ipv4 blah\r
-% [NONE] Unknown command: arg ipv4 blah\r
-test# \r
-test# arg ipv4m 1.2.3.0/24\r
-cmd1 with 3 args.\r
-[00]: arg\r
-[01]: ipv4m\r
-[02]: 1.2.3.0/24\r
-test# arg ipv4m 1.2.\r
- A.B.C.D/M 02\r
-test# arg ipv4m 1.2.3.0/24\r
-cmd1 with 3 args.\r
-[00]: arg\r
-[01]: ipv4m\r
-[02]: 1.2.3.0/24\r
-test# arg ipv4m 1.2.3/9\r
-% [NONE] Unknown command: arg ipv4m 1.2.3/9\r
-test# arg ipv4m 1.2.3.4.5/6\r
-% [NONE] Unknown command: arg ipv4m 1.2.3.4.5/6\r
-test# arg ipv4m 1.a.3.4\r
-% [NONE] Unknown command: arg ipv4m 1.a.3.4\r
-test# arg ipv4m blah\r
-% [NONE] Unknown command: arg ipv4m blah\r
-test# arg ipv4m 1.2.3.0/999\r
-% [NONE] Unknown command: arg ipv4m 1.2.3.0/999\r
-test# arg ipv4m 1.2.3.0/a9\r
-% [NONE] Unknown command: arg ipv4m 1.2.3.0/a9\r
-test# arg ipv4m 1.2.3.0/9a\r
-% [NONE] Unknown command: arg ipv4m 1.2.3.0/9a\r
-test# \r
-test# arg ipv6 de4d:b33f::cafe\r
-cmd2 with 3 args.\r
-[00]: arg\r
-[01]: ipv6\r
-[02]: de4d:b33f::cafe\r
-test# arg ipv6 de4d:b3\r
-% There is no matched command.\r
-test# arg ipv6 de4d:b33f::caf\r
- X:X::X:X 02\r
-test# arg ipv6 de4d:b33f::cafe\r
-cmd2 with 3 args.\r
-[00]: arg\r
-[01]: ipv6\r
-[02]: de4d:b33f::cafe\r
-test# arg ipv6 de4d:b3\r
-test# arg ipv6 de4d:b33f::caf\r
- X:X::X:X 02\r
-test# arg ipv6 de4d:b33f::cafe\r
-cmd2 with 3 args.\r
-[00]: arg\r
-[01]: ipv6\r
-[02]: de4d:b33f::cafe\r
-test# arg ipv6 de4d:b33f:z::cafe\r
-% [NONE] Unknown command: arg ipv6 de4d:b33f:z::cafe\r
-test# arg ipv6 de4d:b33f:cafe:\r
-% [NONE] Unknown command: arg ipv6 de4d:b33f:cafe:\r
-test# arg ipv6 ::\r
-cmd2 with 3 args.\r
-[00]: arg\r
-[01]: ipv6\r
-[02]: ::\r
-test# arg ipv6 ::/\r
-% [NONE] Unknown command: arg ipv6 ::/\r
-test# arg ipv6 1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0\r
-% [NONE] Unknown command: arg ipv6 1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0\r
-test# arg ipv6 12::34::56\r
-% [NONE] Unknown command: arg ipv6 12::34::56\r
-test# arg ipv6m dead:beef:cafe::/64\r
-cmd3 with 3 args.\r
-[00]: arg\r
-[01]: ipv6m\r
-[02]: dead:beef:cafe::/64\r
-test# arg ipv6m dead:be\r
- X:X::X:X/M 02\r
-test# arg ipv6m dead:beef:cafe:\r
- X:X::X:X/M 02\r
-test# arg ipv6m dead:beef:cafe::/64\r
-cmd3 with 3 args.\r
-[00]: arg\r
-[01]: ipv6m\r
-[02]: dead:beef:cafe::/64\r
-test# \r
-test# arg range 4\r
-% [NONE] Unknown command: arg range 4\r
-test# arg range 5\r
-cmd4 with 3 args.\r
-[00]: arg\r
-[01]: range\r
-[02]: 5\r
-test# arg range 9\r
- (5-15) 02\r
-test# arg range 9\r
-cmd4 with 3 args.\r
-[00]: arg\r
-[01]: range\r
-[02]: 9\r
-test# arg range 15\r
-cmd4 with 3 args.\r
-[00]: arg\r
-[01]: range\r
-[02]: 15\r
-test# arg range 16\r
-% [NONE] Unknown command: arg range 16\r
-test# arg range -1\r
-% [NONE] Unknown command: arg range -1\r
-test# arg range 99999999999999999999999999999999999999999\r
-% [NONE] Unknown command: arg range 99999999999999999999999999999999999999999\r
-test# \r
-test# arg \r
- ipv4 01\r
- ipv4m 01\r
- ipv6 01\r
- ipv6m 01\r
- range 01\r
-test# arg \r
-% Command incomplete.\r
-test# \r
-test# pa\r
-test# pa\b\bpat \r
-% Command incomplete.\r
-test# pat \r
-a c d e f \r
-test# pat \r
-% Command incomplete.\r
-test# \r
-test# pat a\r
-% Command incomplete.\r
-test# pat a a\r
-cmd5 with 3 args.\r
-[00]: pat\r
-[01]: a\r
-[02]: a\r
-test# pat a \r
- a 02\r
- b 03\r
-test# pat a b\r
-cmd5 with 3 args.\r
-[00]: pat\r
-[01]: a\r
-[02]: b\r
-test# pat a c\r
-% There is no matched command.\r
-test# pat a c\r
-% [NONE] Unknown command: pat a c\r
-test# pat a a x\r
-% [NONE] Unknown command: pat a a x\r
-test# \r
-test# pat c a\r
-% Command incomplete.\r
-test# pat c a 1.2.3.4\r
-cmd7 with 4 args.\r
-[00]: pat\r
-[01]: c\r
-[02]: a\r
-[03]: 1.2.3.4\r
-test# pat c b 2.3.4\r
-% [NONE] Unknown command: pat c b 2.3.4\r
-test# pat c c \r
- A.B.C.D 05\r
-test# pat c c x\r
-% [NONE] Unknown command: pat c c x\r
-test# \r
-test# pat d\r
-% Command incomplete.\r
-test# pat d \r
-bar baz foo \r
-test# pat d \r
-% Command incomplete.\r
-test# pat d foo 1.2.3.4\r
-cmd8 with 4 args.\r
-[00]: pat\r
-[01]: d\r
-[02]: foo\r
-[03]: 1.2.3.4\r
-test# pat d foo\r
-% Command incomplete.\r
-test# pat d noooo\r
-% [NONE] Unknown command: pat d noooo\r
-test# pat d bar 1::2\r
-cmd8 with 4 args.\r
-[00]: pat\r
-[01]: d\r
-[02]: bar\r
-[03]: 1::2\r
-test# pat d bar 1::2 foo 3.4.5.6\r
-cmd8 with 6 args.\r
-[00]: pat\r
-[01]: d\r
-[02]: bar\r
-[03]: 1::2\r
-[04]: foo\r
-[05]: 3.4.5.6\r
-test# pat d ba\r
- bar 04\r
- baz 06\r
-test# pat d baz\r
-cmd8 with 3 args.\r
-[00]: pat\r
-[01]: d\r
-[02]: baz\r
-test# pat d foo 3.4.5.6 baz\r
-cmd8 with 5 args.\r
-[00]: pat\r
-[01]: d\r
-[02]: foo\r
-[03]: 3.4.5.6\r
-[04]: baz\r
-test# \r
-test# pat e\r
-cmd9 with 2 args.\r
-[00]: pat\r
-[01]: e\r
-test# pat e f\r
-cmd9 with 3 args.\r
-[00]: pat\r
-[01]: e\r
-[02]: f\r
-test# pat e f g\r
-% [NONE] Unknown command: pat e f g\r
-test# pat e 1.2.3.4\r
-cmd9 with 3 args.\r
-[00]: pat\r
-[01]: e\r
-[02]: 1.2.3.4\r
-test# \r
-test# pat f\r
-cmd10 with 2 args.\r
-[00]: pat\r
-[01]: f\r
-test# pat f foo\r
-% [NONE] Unknown command: pat f foo\r
-test# pat f key\r
-cmd10 with 3 args.\r
-[00]: pat\r
-[01]: f\r
-[02]: key\r
-test# \r
-test# alt a \r
-test# alt a a\r
- WORD 02\r
-test# alt a ab\r
-cmd11 with 3 args.\r
-[00]: alt\r
-[01]: a\r
-[02]: ab\r
-test# alt a 1\r
-test# alt a 1.2\r
- A.B.C.D 02\r
- WORD 02\r
-test# alt a 1.2.3.4\r
-cmd12 with 3 args.\r
-[00]: alt\r
-[01]: a\r
-[02]: 1.2.3.4\r
-test# alt a 1\r
-test# alt a 1:2\r
- WORD 02\r
-test# alt a 1:2\r
-test# alt a 1:2::\r
- WORD 02\r
- X:X::X:X 02\r
-test# alt a 1:2::3\r
-cmd13 with 3 args.\r
-[00]: alt\r
-[01]: a\r
-[02]: 1:2::3\r
-test# \r
-test# conf t\r
-test(config)# do pat d baz\r
-cmd8 with 3 args.\r
-[00]: pat\r
-[01]: d\r
-[02]: baz\r
-test(config)# exit\r
-test# \r
-test# show run\r
-\r
-Current configuration:\r
-!\r
-hostname test\r
-!\r
-!\r
-line vty\r
-!\r
-end\r
-test# conf t\r
-test(config)# hostname foohost\r
-foohost(config)# do show run\r
-\r
-Current configuration:\r
-!\r
-hostname foohost\r
-!\r
-!\r
-line vty\r
-!\r
-end\r
-foohost(config)#
-end.
--- /dev/null
+test# echo this is a test message\r
+this is a test message\r
+test# echo foo bla \r
+% There is no matched command.\r
+test# echo foo bla baz\r
+foo bla baz\r
+test# echo\r
+% Command incomplete.\r
+test# \r
+test# arg ipv4 1.2.3.4\r
+cmd0 with 3 args.\r
+[00]: arg\r
+[01]: ipv4\r
+[02]: 1.2.3.4\r
+test# arg ipv4 1.2.\r
+ A.B.C.D 02\r
+test# arg ipv4 1.2.3.4\r
+cmd0 with 3 args.\r
+[00]: arg\r
+[01]: ipv4\r
+[02]: 1.2.3.4\r
+test# arg ipv4 1.2.3\r
+% [NONE] Unknown command: arg ipv4 1.2.3\r
+test# arg ipv4 1.2.3.4.5\r
+% [NONE] Unknown command: arg ipv4 1.2.3.4.5\r
+test# arg ipv4 1.a.3.4\r
+% [NONE] Unknown command: arg ipv4 1.a.3.4\r
+test# arg ipv4 blah\r
+% [NONE] Unknown command: arg ipv4 blah\r
+test# \r
+test# arg ipv4m 1.2.3.0/24\r
+cmd1 with 3 args.\r
+[00]: arg\r
+[01]: ipv4m\r
+[02]: 1.2.3.0/24\r
+test# arg ipv4m 1.2.\r
+ A.B.C.D/M 02\r
+test# arg ipv4m 1.2.3.0/24\r
+cmd1 with 3 args.\r
+[00]: arg\r
+[01]: ipv4m\r
+[02]: 1.2.3.0/24\r
+test# arg ipv4m 1.2.3/9\r
+% [NONE] Unknown command: arg ipv4m 1.2.3/9\r
+test# arg ipv4m 1.2.3.4.5/6\r
+% [NONE] Unknown command: arg ipv4m 1.2.3.4.5/6\r
+test# arg ipv4m 1.a.3.4\r
+% [NONE] Unknown command: arg ipv4m 1.a.3.4\r
+test# arg ipv4m blah\r
+% [NONE] Unknown command: arg ipv4m blah\r
+test# arg ipv4m 1.2.3.0/999\r
+% [NONE] Unknown command: arg ipv4m 1.2.3.0/999\r
+test# arg ipv4m 1.2.3.0/a9\r
+% [NONE] Unknown command: arg ipv4m 1.2.3.0/a9\r
+test# arg ipv4m 1.2.3.0/9a\r
+% [NONE] Unknown command: arg ipv4m 1.2.3.0/9a\r
+test# \r
+test# arg ipv6 de4d:b33f::cafe\r
+cmd2 with 3 args.\r
+[00]: arg\r
+[01]: ipv6\r
+[02]: de4d:b33f::cafe\r
+test# arg ipv6 de4d:b3\r
+% There is no matched command.\r
+test# arg ipv6 de4d:b33f::caf\r
+ X:X::X:X 02\r
+test# arg ipv6 de4d:b33f::cafe\r
+cmd2 with 3 args.\r
+[00]: arg\r
+[01]: ipv6\r
+[02]: de4d:b33f::cafe\r
+test# arg ipv6 de4d:b3\r
+test# arg ipv6 de4d:b33f::caf\r
+ X:X::X:X 02\r
+test# arg ipv6 de4d:b33f::cafe\r
+cmd2 with 3 args.\r
+[00]: arg\r
+[01]: ipv6\r
+[02]: de4d:b33f::cafe\r
+test# arg ipv6 de4d:b33f:z::cafe\r
+% [NONE] Unknown command: arg ipv6 de4d:b33f:z::cafe\r
+test# arg ipv6 de4d:b33f:cafe:\r
+% [NONE] Unknown command: arg ipv6 de4d:b33f:cafe:\r
+test# arg ipv6 ::\r
+cmd2 with 3 args.\r
+[00]: arg\r
+[01]: ipv6\r
+[02]: ::\r
+test# arg ipv6 ::/\r
+% [NONE] Unknown command: arg ipv6 ::/\r
+test# arg ipv6 1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0\r
+% [NONE] Unknown command: arg ipv6 1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0:1:2:3:4:5:6:7:8:9:0\r
+test# arg ipv6 12::34::56\r
+% [NONE] Unknown command: arg ipv6 12::34::56\r
+test# arg ipv6m dead:beef:cafe::/64\r
+cmd3 with 3 args.\r
+[00]: arg\r
+[01]: ipv6m\r
+[02]: dead:beef:cafe::/64\r
+test# arg ipv6m dead:be\r
+ X:X::X:X/M 02\r
+test# arg ipv6m dead:beef:cafe:\r
+ X:X::X:X/M 02\r
+test# arg ipv6m dead:beef:cafe::/64\r
+cmd3 with 3 args.\r
+[00]: arg\r
+[01]: ipv6m\r
+[02]: dead:beef:cafe::/64\r
+test# \r
+test# arg range 4\r
+% [NONE] Unknown command: arg range 4\r
+test# arg range 5\r
+cmd4 with 3 args.\r
+[00]: arg\r
+[01]: range\r
+[02]: 5\r
+test# arg range 9\r
+ (5-15) 02\r
+test# arg range 9\r
+cmd4 with 3 args.\r
+[00]: arg\r
+[01]: range\r
+[02]: 9\r
+test# arg range 15\r
+cmd4 with 3 args.\r
+[00]: arg\r
+[01]: range\r
+[02]: 15\r
+test# arg range 16\r
+% [NONE] Unknown command: arg range 16\r
+test# arg range -1\r
+% [NONE] Unknown command: arg range -1\r
+test# arg range 99999999999999999999999999999999999999999\r
+% [NONE] Unknown command: arg range 99999999999999999999999999999999999999999\r
+test# \r
+test# arg \r
+ ipv4 01\r
+ ipv4m 01\r
+ ipv6 01\r
+ ipv6m 01\r
+ range 01\r
+test# arg \r
+% Command incomplete.\r
+test# \r
+test# pa\r
+test# pa\b\bpat \r
+% Command incomplete.\r
+test# pat \r
+a c d e f \r
+test# pat \r
+% Command incomplete.\r
+test# \r
+test# pat a\r
+% Command incomplete.\r
+test# pat a a\r
+cmd5 with 3 args.\r
+[00]: pat\r
+[01]: a\r
+[02]: a\r
+test# pat a \r
+ a 02\r
+ b 03\r
+test# pat a b\r
+cmd5 with 3 args.\r
+[00]: pat\r
+[01]: a\r
+[02]: b\r
+test# pat a c\r
+% There is no matched command.\r
+test# pat a c\r
+% [NONE] Unknown command: pat a c\r
+test# pat a a x\r
+% [NONE] Unknown command: pat a a x\r
+test# \r
+test# pat c a\r
+% Command incomplete.\r
+test# pat c a 1.2.3.4\r
+cmd7 with 4 args.\r
+[00]: pat\r
+[01]: c\r
+[02]: a\r
+[03]: 1.2.3.4\r
+test# pat c b 2.3.4\r
+% [NONE] Unknown command: pat c b 2.3.4\r
+test# pat c c \r
+ A.B.C.D 05\r
+test# pat c c x\r
+% [NONE] Unknown command: pat c c x\r
+test# \r
+test# pat d\r
+% Command incomplete.\r
+test# pat d \r
+bar baz foo \r
+test# pat d \r
+% Command incomplete.\r
+test# pat d foo 1.2.3.4\r
+cmd8 with 4 args.\r
+[00]: pat\r
+[01]: d\r
+[02]: foo\r
+[03]: 1.2.3.4\r
+test# pat d foo\r
+% Command incomplete.\r
+test# pat d noooo\r
+% [NONE] Unknown command: pat d noooo\r
+test# pat d bar 1::2\r
+cmd8 with 4 args.\r
+[00]: pat\r
+[01]: d\r
+[02]: bar\r
+[03]: 1::2\r
+test# pat d bar 1::2 foo 3.4.5.6\r
+cmd8 with 6 args.\r
+[00]: pat\r
+[01]: d\r
+[02]: bar\r
+[03]: 1::2\r
+[04]: foo\r
+[05]: 3.4.5.6\r
+test# pat d ba\r
+ bar 04\r
+ baz 06\r
+test# pat d baz\r
+cmd8 with 3 args.\r
+[00]: pat\r
+[01]: d\r
+[02]: baz\r
+test# pat d foo 3.4.5.6 baz\r
+cmd8 with 5 args.\r
+[00]: pat\r
+[01]: d\r
+[02]: foo\r
+[03]: 3.4.5.6\r
+[04]: baz\r
+test# \r
+test# pat e\r
+cmd9 with 2 args.\r
+[00]: pat\r
+[01]: e\r
+test# pat e f\r
+cmd9 with 3 args.\r
+[00]: pat\r
+[01]: e\r
+[02]: f\r
+test# pat e f g\r
+% [NONE] Unknown command: pat e f g\r
+test# pat e 1.2.3.4\r
+cmd9 with 3 args.\r
+[00]: pat\r
+[01]: e\r
+[02]: 1.2.3.4\r
+test# \r
+test# pat f\r
+cmd10 with 2 args.\r
+[00]: pat\r
+[01]: f\r
+test# pat f foo\r
+% [NONE] Unknown command: pat f foo\r
+test# pat f key\r
+cmd10 with 3 args.\r
+[00]: pat\r
+[01]: f\r
+[02]: key\r
+test# \r
+test# alt a \r
+test# alt a a\r
+ WORD 02\r
+test# alt a ab\r
+cmd11 with 3 args.\r
+[00]: alt\r
+[01]: a\r
+[02]: ab\r
+test# alt a 1\r
+test# alt a 1.2\r
+ A.B.C.D 02\r
+ WORD 02\r
+test# alt a 1.2.3.4\r
+cmd12 with 3 args.\r
+[00]: alt\r
+[01]: a\r
+[02]: 1.2.3.4\r
+test# alt a 1\r
+test# alt a 1:2\r
+ WORD 02\r
+test# alt a 1:2\r
+test# alt a 1:2::\r
+ WORD 02\r
+ X:X::X:X 02\r
+test# alt a 1:2::3\r
+cmd13 with 3 args.\r
+[00]: alt\r
+[01]: a\r
+[02]: 1:2::3\r
+test# \r
+test# conf t\r
+test(config)# do pat d baz\r
+cmd8 with 3 args.\r
+[00]: pat\r
+[01]: d\r
+[02]: baz\r
+test(config)# exit\r
+test# \r
+test# show run\r
+\r
+Current configuration:\r
+!\r
+frr version @PACKAGE_VERSION@\r
+frr defaults @DFLT_NAME@\r
+!\r
+hostname test\r
+!\r
+!\r
+line vty\r
+!\r
+end\r
+test# conf t\r
+test(config)# hostname foohost\r
+foohost(config)# do show run\r
+\r
+Current configuration:\r
+!\r
+frr version @PACKAGE_VERSION@\r
+frr defaults @DFLT_NAME@\r
+!\r
+hostname foohost\r
+!\r
+!\r
+line vty\r
+!\r
+end\r
+foohost(config)#
+end.
{
if (strncmp (line, "log", strlen ("log")) == 0
|| strncmp (line, "hostname", strlen ("hostname")) == 0
+ || strncmp (line, "frr", strlen ("frr")) == 0
)
config_add_line_uniq (config_top, line);
else
vty_out (vty, "debug zebra fpm%s", VTY_NEWLINE);
write++;
}
+ if (IS_ZEBRA_DEBUG_NHT)
+ {
+ vty_out (vty, "debug zebra nht%s", VTY_NEWLINE);
+ write++;
+ }
if (IS_ZEBRA_DEBUG_MPLS)
{
vty_out (vty, "debug zebra mpls%s", VTY_NEWLINE);
#include "qpb/qpb_allocator.h"
#include "qpb/linear_allocator.h"
+#ifdef HAVE_PROTOBUF
#include "qpb/qpb.h"
#include "fpm/fpm.pb-c.h"
+#endif
/*
* Externs.