When mpls is not turned on in the kernel, we
are not installing the mpls commands into the cli.
This results in vtysh attempting to run the command
and receiving a 'WTF is this command' back from zebra.
Modify the mpls code to install commands and to check
to see if the command should be accepted based
upon mpls working or not.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Consolidate the routemap initialization into one
function.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
In some circumstances, the quagga log is being filled with repetitive
error messages reporting "network is down" with RTM_NEWROUTE. Moved this
particular scenario under "debug zebra kernel" instead of making it an
unprotected error message. Manually tested using the same script with and
without the fix to verify the message is suppressed.
Ticket: CM-11173
Signed-off-by: Don Slice
Reviewed-by: Donald Sharp
Change redist_check_instance() to return a pointer instead of returning 1
on success. This way this function can be reused in redist_del_instance()
instead of duplicating the same logic there.
Also, remove unnecessary call to redist_check_instance() in
zebra_redistribute_delete().
While here, remove unnecessary cast from void* in redist_add_instance().
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
We should not check/modify client->redist[] when the requested instance
is different than zero.
In the same way, we should not check/modify client->mi_redist[] when
the requested instance is zero.
Failure to respect these conditions can lead to unexpected behavior in
the client daemons.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
As a general rule of thumb, we should write functions that do one thing
and that do it well. All callers of zsend_redistribute_route() are already
checking if the route should be redistributed or not (as the comment
says), so we definitely shouldn't bother with that in this function.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
We were always redistributing the default routes (IPv[46]) in
redistribute_update() because the 'client->redist_default' condition
always returns true.
The 'redist_default' member of the 'zserv' structure is a pointer and is
always initialized with vrf_bitmap_init() in the zebra_client_create()
function.
To fix this, use vrf_bitmap_check() instead.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
The ZEBRA_ROUTE_ALL route type can be used by a client to request
all routes from zebra. The main motivation for introducing this is
to allow ldpd to get routes from all OSPF instances, not only from
the default one. Without ZEBRA_ROUTE_ALL, ldpd would need to send a
ZEBRA_REDISTRIBUTE_ADD message for each possible OSPF instance (65k),
which doesn't scale very well.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Fix for not handling RTM_CHANGE correctly. This patch change it to
delete/add instead. Using RTM_CHANGE on kernels where it works is better,
but is left as an exercise for developer who has access and will to fix it
on *BSD.
[ed note: collaboration with Martin Winter]
[DL: picked out from: "atomic FIB updates"]
This simplifies the OS-specific route update API into a single entry
point, kernel_route_rib(), which dispatches the various operations
internally.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
None of the BSDs uses ioctls to set routes anymore.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Acked-by: Greg Troxel <gdt@ir.bbn.com>
Acked-by: Feng Lu <lu.feng@6wind.com>
Acked-by: Paul Jakma <paul@jakma.org>
If a command is put into the VIEW_NODE, it is going into the
ENABLE_NODE as well. This is especially true for show commands.
As such if a command is in both consolidate it down to VIEW_NODE.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This patch improves zebra,ripd,ripngd,ospfd and bgpd so that they can
make use of 32-bit route tags in the case of zebra,ospf,bgp or 16-bit
route-tags in the case of ripd,ripngd.
It is based on the following patch:
commit d25764028829a3a30cdbabe85f32408a63cccadf
Author: Paul Jakma <paul.jakma@hpe.com>
Date: Fri Jul 1 14:23:45 2016 +0100
*: Widen width of Zserv routing tag field.
But also contains the changes which make this actually useful for all
the daemons.
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
This commit fixes some warnings found in Martin's Testbed
that compiles sun solaris and freebsd images.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This puts all the proper VTY_DECLVAR_CONTEXT calls in place, removing
all vty->index uses in the process. With that, vty_config_lockless can
be enabled in zebra.
[v2: fix ordering screw-up in "interface XXX" command]
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Added the capability of defining an ipv6 static route to null0,
similar to the support previously in ipv4 only.
Ticket: CM-5794
Signed-off-by: Don Slice
Reviewed By: CCR-5223
Testing Done: Manual tested added to the ticket and bgp and ospf smoke
successfully completed
When calling a route uninstall in zebra_static.c use the
afi passed in and don't hardcode AFI_IP
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
This feature adds an L3 & L2 VPN application that makes use of the VPN
and Encap SAFIs. This code is currently used to support IETF NVO3 style
operation. In NVO3 terminology it provides the Network Virtualization
Authority (NVA) and the ability to import/export IP prefixes and MAC
addresses from Network Virtualization Edges (NVEs). The code supports
per-NVE tables.
The NVE-NVA protocol used to communicate routing and Ethernet / Layer 2
(L2) forwarding information between NVAs and NVEs is referred to as the
Remote Forwarder Protocol (RFP). OpenFlow is an example RFP. For
general background on NVO3 and RFP concepts see [1]. For information on
Openflow see [2].
RFPs are integrated with BGP via the RF API contained in the new "rfapi"
BGP sub-directory. Currently, only a simple example RFP is included in
Quagga. Developers may use this example as a starting point to integrate
Quagga with an RFP of their choosing, e.g., OpenFlow. The RFAPI code
also supports the ability import/export of routing information between
VNC and customer edge routers (CEs) operating within a virtual
network. Import/export may take place between BGP views or to the
default zebera VRF.
BGP, with IP VPNs and Tunnel Encapsulation, is used to distribute VPN
information between NVAs. BGP based IP VPN support is defined in
RFC4364, BGP/MPLS IP Virtual Private Networks (VPNs), and RFC4659,
BGP-MPLS IP Virtual Private Network (VPN) Extension for IPv6 VPN . Use
of both the Encapsulation Subsequent Address Family Identifier (SAFI)
and the Tunnel Encapsulation Attribute, RFC5512, The BGP Encapsulation
Subsequent Address Family Identifier (SAFI) and the BGP Tunnel
Encapsulation Attribute, are supported. MAC address distribution does
not follow any standard BGB encoding, although it was inspired by the
early IETF EVPN concepts.
The feature is conditionally compiled and disabled by default.
Use the --enable-bgp-vnc configure option to enable.
The majority of this code was authored by G. Paul Ziemba
<paulz@labn.net>.
[1] http://tools.ietf.org/html/draft-ietf-nvo3-nve-nva-cp-req
[2] https://www.opennetworking.org/sdn-resources/technical-library
Now includes changes needed to merge with cmaster-next.
FIB override routes are for routing protocols that establish
shortcut routes, or establish point-to-point routes that should
not be redistributed. Namely this is useful NHRP daemon to come.
Zebra is extended to select two entries from RIB the "best" entry
from routing protocols, and the FIB entry to install to kernel.
FIB override routes are never selected as best entry, and thus
are never adverticed to other routing daemons. The best FIB
override, or if it does not exist the otherwise best RIB is
selected as FIB entry to be installed.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Acked-by: Donald Sharp <sharpd@cumulusnetworks.com>
[CF: Massage to fit cumulus tree]
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
Whenever a routing daemon advertises a new version of a route to zebra,
zebra removes the old version of this route (implicit withdraw) and then
create a new 'rib' structure for the new version of the route.
In this process, the previously received label(s) from ldpd are lost. This
is because upon receiving a ZEBRA_MPLS_LABELS_ADD message, zebra only
adds a label to a nexthop of an existing route. And routes are volatile,
they can be removed while being updated.
To workaround this issue, this patch makes ldpd always advertise the
appropriate labels whenever it receives a redistributed route, even
if it was already received before (an older version). This way, when
ldpd receives the updated version of a route, it will readvertise the
appropriate label(s) and zebra will reinstall them.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Don Slice <dslice@cumulusnetworks.com>
Ticket: CM-13020
Now that we have evpn we have the following AFIs
/* Address family numbers from RFC1700. */
typedef enum {
AFI_IP = 1,
AFI_IP6 = 2,
AFI_ETHER = 3, /* RFC 1700 has "6" for 802.* */
AFI_MAX = 4
} afi_t;
The import-table code was treating the afi as a flag which was fine
before when the only choices were 1 and 2 but now that we have #3 that
doesn't work. The fix is to change zebra_import_table_used to a
[AFI_MAX][ZEBRA_KERNEL_TABLE_MAX] array to track if import-table is
enabled.
BABEL was removed, ifname nexthops were removed, additional includes
were needed, and lastly the protobuf enum-handling triggers a warning.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Add test functions for the zebra code that interfaces with the
Forwarding Plane Manager. These functions can be invoked in a
development build via the recently-added 'invoke' command.
For example:
# invoke zebra function zfpm_dt_benchmark_protobuf_encode 100000
Changes:
* zebra/zebra_fpm_dt.c
Add the following functions. Each function encodes or decodes a
route in a particular FPM format a specified number of times.
- zfpm_dt_benchmark_netlink_encode()
- zfpm_dt_benchmark_protobuf_encode()
- zfpm_dt_benchmark_protobuf_decode()
* zebra/Makefile.am
Compile zebra_fpm_dt when building a development build.
Signed-off-by: Avneesh Sachdev <avneesh@sproute.com>
Change zebra so that it can optionally use protobuf serialization when
communicating with a Forwarding Plane Manager component.
* zebra/main.c
Add the --fpm-format/-F command line option. This allows the user
to control the format (protbuf|netlink) that is used to
communicate with the FPM.
* zebra/zebra_fpm.c
- zebra_init_msg_format(),
This new function is invoked on process startup to determine the
FPM format that should be used.
- zfpm_init()
Change to accept any 'FPM message format' specified by the user
(via the new command line flag).
- zebra_encode_route()
Tweak to use the selected FPM format.
* zebra_fpm_protobuf.c
New code to build protobuf messages to be sent to the FPM.
* zebra/Makefile.am
- Include common.am
- Build new file zebra_fpm_protobuf.c when protobuf is available.
- Link with the fpm_pb library.
Signed-off-by: Avneesh Sachdev <avneesh@sproute.com>
FPM aims to provide cross platform mechanism to support the scenario
where the router has forwarding path distinct fromt the kernel.Commonly
Hardware based fast path.Hence it is non-configurable paramter.This
limits us to use funcationality to update FIB information to remote
hosts, like SDN controller.
This implementation provides the CLI to configure remote hosts and port
information of remote fpm controller.Otherwise default fpm server will
be localhost and default fpm port will be well know port 2620.
* zebra_fpm.c: added fpm_server paramter to zfpm_global_t handler.
Implemented CLI for configuring the fpm server and no fpm
command to revert back to default configuration.
* zserv.c: Install zebra node to write fpm configuration info
on console/config file.
Further documentation supplied:
-------------------------------
ZEBRA : CLI CONFIGURATION FOR FPM MODULE
========================================================
1. INTRODUCTION
================================
1.1 scope
This memo discusses the configuration option for zebra to update
FIB information to local and remote modules.
This will also helps to address the issue associated with CORD project.
https://jira.onosproject.org/browse/CORD-411
2. REFERENCE
================================
Quagga version 99.24+ ( main branch committed on 29-sep-2015)
3. PROBLEM DESCRIPTION
================================
Once FPM is enabled, Quagga periodically tries to initiate fpm
connection to localhost:2620. These values are non configurable in
existing implementation. There is no CLI available to configure
"host:port". hence limits us to use it for hardware based fast path
modules only.
4. PROPOSED CHANGES
================================
Following changes are done to the quagga code
a) Added new CLI to configure "host address : port".
The CLI format
<conf t>
$ fpm connection ip <ipv4 address> port <tcp port num>
and no fpm command to revert back to default
<conf t>
$ no fpm connection ip <ipv4 address> port <tcp port num>
b) Allowed values are ipv4 address and tcp port range <1-65535>
c) FPM initialization code has been enhanced to pick the "host
address : port" values from zebra.conf. if not found then
default values as localhost:2620 will be used. and updated the
information on to config file on write config command
5. FILES MODIFIED
================================
1) fpm/fpm.h :
a) Added MACRO to represent network order loopback ip
2) zebra/zebra_fpm.h :
a) introduced fpm_server variable in zfpm_glob_t handler to hold
the remote fpm server address
b) Hooked 'fpm_remote_ip_cmd' and 'no_fpm_remote_ip_cmd' at CONFIG
node to configure remote fpm detail and to revert back to
default respectively
3) zebra/zserv.c :
a) Hooked 'config_write_fpm' callback function, at ZEBRA_NODE to
display the fpm connection details on console on entering
command
$ show running_config
and to write to configuration file on entering command
$ write config
6. TESTING DETAILS
================================
6.1. default behavior
In default configuration FPM will attempt to connect to
localhost:2620
6.2. update fpm info
a) Using CLI command user can configure fpm host:port details
and can be able to write to config file(zebra.conf) using
write config command. this parameters has no
dependency/impact on other parameters of config file
b) show running-config/write config will display the fpm
information if configured. and will not display any
information related to fpm for default configuration
c) these configured information will be stored to config file.
only on write config command.
6.3 loading from config file
a) zebra attempts to connect to fpm server if fpm parameter
found in config file.else connects to default parameters.
b) if fpm connection drops, fpm will periodically attempts to
connect to remote server.
c) if fpm connections already established. then newly
configured fpm parameters will not disconnect the existing
connection. new connection to the different fpm server will
happen only after existing connection closes by either of
the end.
fix fpm prototype
FIB override routes are for routing protocols that establish
shortcut routes, or establish point-to-point routes that should
not be redistributed. Namely this is useful NHRP daemon to come.
Zebra is extended to select two entries from RIB the "best" entry
from routing protocols, and the FIB entry to install to kernel.
FIB override routes are never selected as best entry, and thus
are never adverticed to other routing daemons. The best FIB
override, or if it does not exist the otherwise best RIB is
selected as FIB entry to be installed.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Acked-by: Donald Sharp <sharpd@cumulusnetworks.com>
[CF: Massage to fit cumulus tree]
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
In linux, 'scope' is a hint of distance of the IP. And this is
evident from the fact that only lower scope can be used as recursive
via lookup result. This changes all interface routes scope to link
so kernel will allow regular routes to use it as via. Then we do
not need to use the 'onlink' attribute.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Replace all HAVE_MPLS #ifdef's by a run-time check if MPLS is supported
by the kernel or not. This way we don't need to create multiple packages
for each OS distribution.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Most routing daemons are not interested in certain pieces of information
when a redistributed route is being removed, like its metric and distance.
ldpd, in the other hand, needs to know the distance of the removed routes
in order to work properly. Now, instead of adding another exception in
zserv's code for ldpd, let's make zebra always send all information
about each route to its clients, independently if the route is being
added or removed. This is ok because all daemons are already prepared
to process these additional fields when the appropriate flags are set
in the zebra messages.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>