* Initial import of the Babel routing protocol, ported to Quagga.
* LICENCE: Update the original LICENCE file to include all known potentially
applicable copyright claims. Ask that any future contributors to babeld/
grant MIT/X11 licence to their work.
* *.{c,h}: Add GPL headers, in according with the SFLC guidance on
dealing with potentially mixed GPL/other licensed work, at:
https://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html
ipv6 nd ra-interval
ipv6 nd ra-lifetime
ipv6 nd reachable-time
ipv6 nd home-agent-preference
ipv6 nd home-agent-lifetime
ipv6 nd router-preference
Calls to atoi() and atol() are replaced with VTY_GET_INTEGER_RANGE()
macro, command patterns are clarified and aliases of some commands
are added for consistency. Other changes are listed below.
* zebra/rtadv.c
* ipv6_nd_ra_interval_msec(): resolve -Wsign-compare
* ipv6_nd_ra_interval(): idem
* rtadv_init(): update to list new aliases
* doc/ipv6.texi: update to match current implementation
RFC4861 4.6.2. Prefix Information
Prefix An IP address or a prefix of an IP address. The
Prefix Length field contains the number of valid
leading bits in the prefix. The bits in the prefix
after the prefix length are reserved and MUST be
initialized to zero by the sender and ignored by
the receiver.
* rtadv.c
* ipv6_nd_prefix(): add missing call to apply_mask_ipv6()
* no_ipv6_nd_prefix(): idem
There was a regression introduced with the previous commit:
"ipv6 nd home-agent-lifetime 1800000" appeared by default in every
interface section of running-config, although this command is
invalid in this context. Troubleshooting and bugfixing of the issue
tracked out several bugs in router advertisement procedures, some of
which are fixed in this commit.
* zebra/interface.c
* if_zebra_new_hook(): update to treat -1 as "uninitialized"
* nd_dump_vty(): idem
* zebra/rtadv.c
* rtadv_send_packet(): update processing of "router lifetime" field,
"home agent" option and "home agent lifetime" field to conform to
RFC6275 better
* ipv6_nd_ra_interval_msec(): update MaxRtrAdvInterval range check,
make sure it never exceeds (initialized) AdvDefaultLifetime
* ipv6_nd_ra_interval(): idem
* ipv6_nd_ra_lifetime(): update AdvDefaultLifetime range check, make
sure it never falls below MaxRtrAdvInterval
* ipv6_nd_homeagent_lifetime(): update HomeAgentLifetime range check
* no_ipv6_nd_ra_lifetime(): update to treat -1 as "uninitialized"
* no_ipv6_nd_homeagent_lifetime(): idem
* rtadv_config_write(): idem
The following options could be configured for an interface, but were
never visible in the config text:
ipv6 nd adv-interval-option
ipv6 nd home-agent-preference
ipv6 nd home-agent-lifetime
ipv6 nd home-agent-config-flag
This patch contains the following:
1. Addition of IPv6 SAFI_MULTICAST BGP routes into the RTM's RIB.
2. Deletion of IPv6 SAFI_MULTICAST BGP routes from the RTM's RIB.
This patch contains the following:
1. Addition of IPv4 SAFI_MULTICAST BGP routes into the RTM's RIB.
2. Deletion of IPv4 SAFI_MULTICAST BGP routes from the RTM's RIB.
This implements a new "ipv6 nd mtu <1-65535>" interface-level command.
* doc/ipv6.texi: add description
* zebra/rtadv.c
* rtadv_send_packet(): send option type 5, when configured
* ipv6_nd_mtu(): new VTY helper
* no_ipv6_nd_mtu(): ditto
* rtadv_config_write(): add new option
* rtadv_init(): list new helpers
* (general) Move functions in headers into files, to be compiled into
shared object files. Remove inline qualifier from functions. Let the
compiler do the work.
When the same ip address is used on several interfaces,
and one of them gets deleted (or equivalent: set to down and
then address removed), rib_delete_ipv[46] will also remove
the connected route from other interfaces.
rib_delete_ipv[46] is called twice when an interface is
deleted:
- for the "ifdown" event
- for the address removal
(note: this may be specific to the netlink interface of linux)
The second call does not find the connected route to that same
ifindex anymore, but deletes similar connected routes to any
other ifindex instead.
Reason: the ifindex check is on the same level as the check
for ZEBRA_ROUTE_CONNECT/NEXTHOP_TYPE_IFINDEX. If everything
matches except for the ifindex, the "else" part (intended for
different route types) is executed, thus removing the route
from the wrong interface.
fix: move ifindex check inside the "then" part of the check
for ZEBRA_ROUTE_CONNECT/NEXTHOP_TYPE_IFINDEX. Now connected
routes to other ifindexes will not spill over to the "else"
part for different route types anymore.
ZEBRA_HELLO message is used by routing daemons to inform zebra
what type of routes daemon will be announcing to zebra. Also
zebra uses route_type_oaths array to track which daemon announces
which protocol. Zebra mops up routes if daemon didn't for some
reason.
this replaces most occurences of routing protocol lists by preprocessor
defines from route_types.h. the latter is autogenerated from
route_types.txt by a perl script (previously awk). adding a routing
protocol now is mostly a matter of changing route_types.txt and log.c.
Conflicts:
lib/route_types.awk
adding protocols and forgetting to update zebra_rib.c currently causes
a beyond end of array access for the default distance value. fix by
making 150 the default distance for unknown routing protocols.
150 is higher than all other IGPs but lower than iBGP (200)
* kernel_socket.c: (ifm_read) The reorganization from commit
6fe70d1b35 removed setting the
interface link-layer socket address structure on routing socket
platforms. This restores saving the link-layer information because
it might be used elsewhere: rtm_write() when no gateway is given,
if_dump_vty() and rtadv_send_packet().
All daemons modified to support custom path to zserv
socket.
lib: generalize a zclient connection
zclient_socket_connect added. zclient_socket and
zclient_socket_un were hidden under static expression.
"zclient_serv_path_set" modified.
When deleting a VLAN interface after flushing its
addresses, zebra uses 100% CPU time and freezes.
* interface.c: The while loop in line 407 that
should clean up connected routes never hits one
of the 2 lines "last = node;" and thus loops
forever.
Signed-off-by: Roman Hoog Antink <rha@open.ch>
The router-id table looks like is supposed to be sorted in current
quagga code, but the nodes are not added with the sorting
function.
The sorting function is host byte order dependent.
The values need to converted before comparison.
Fixing this causes Zebra to choose the largest IP address
as router-id, rather than the last address. This probably will
surprise some users. The other option would be to just remove the
comparison function and keep the existing LIFO behavior.
Lastly, simple subtraction works well for comparing.
* zebra/router-id.c
* router_id_add_address(): employ listnode_add_sort()
* router_id_cmp(): employ ntohl(), then compare integers
* zebra/irdp.h
* irdp_send_thread(): move prototype to common header file
* irdp_advert_off(): idem
* process_solicit(): idem
* irdp_read_raw(): idem
* send_packet(): idem
* zebra/irdp_interface.c
* inet_2a(): move function to where it is used
* in_cksum(): lib/checksum.h already provides prototype
* irdp_send_thread(): prototype moved away
* inet_2a(): idem
* irdp_advert_off(): idem
* b1, b2, b3, b4: get rid of global buffers for inet_2a()
* if_group(): add local buffer for inet_2a()
* if_add_group(): idem
* if_drop_group(): idem
* irdp_config_write(): idem
* Adv_new(): make static
* zebra/irdp_main.c
* irdp_read_raw(): prototype moved away
* send_packet(): idem
* in_cksum(): lib/checksum.h already provides prototype
* inet_2a(): function moved to irdp_interface.c
* zebra/irdp_packet.c
* b1, b2, b3, b4: get rid of global buffers for inet_2a()
* in_cksum(): lib/checksum.h already provides prototype
* process_solicit(): prototype moved away
* irdp_read_raw(): fix uninitialized variable
* zebra/rtadv.c
* rtadv_free(): remove unused function
* rtadv_recv_packet(): break up cast/dereference to avoid
compiler type pun warning
* rtadv_read(): initialize ifindex, because compiler can't
figure out that it is okay
* zebra/zebra_rib.c
* nexthop_active_update(): make local int vars unsigned
* nexthop_active_check(): return unsigned for consistency
* rib_dump(): cast time in printf format
* vrf_free(): remove unused function
* vrf_lookup_by_name(): idem
* rib_if_up(): idem
* rib_if_down(): idem
* kernel_null.c: we're pretending to add an address, so
set IFC_REAL. If this isn't done, calling into the 'got address
from kernel' half of zebra will implicitly-withdraw the ifc, which
could cause a crash in test_zebra.c.
Move zserv socket creation code into zebra_zserv_socket_init() and
call it only after pidfile lock has been acquired exclusively. This
keeps subsequent zebra daemons from deleting the working socket of
an already running process (bug #403).
A static route like below: ip route 172.16.1.0/30 192.168.101.162 11
does not move properly to a new interface when the
interface used goes down. Zebra reports that it have
moved but kernel isn't informed so the route is lost.
* zebra_rib.c: (nexthop_active_update) if ifindex has changed, then the
route should be considered to have changed.
Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
Quagga support linux policy routing (ip route ... table $X) with zebra.conf
table $X option. It works fine on ipv4. On ipv6 the parameter is ignored
(table 0 is used).
* zebra/...: Pass appropriate table arg to rib_{add,delete}_ipv6