G.Balaji [Sat, 26 Nov 2011 18:04:05 +0000 (22:04 +0400)]
bgpd: IPv6 MP-BGP Routes addition and deletion
This patch contains the following:
1. Addition of IPv6 SAFI_MULTICAST BGP routes into the BGP Multicast RIB.
2. Deletion of IPv6 SAFI_MULTICAST BGP routes from the BGP Multicast RIB.
G.Balaji [Sat, 26 Nov 2011 17:59:32 +0000 (21:59 +0400)]
zebra: IPv4 MP-BGP Routes addition and deletion
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.
G.Balaji [Sat, 26 Nov 2011 17:58:42 +0000 (21:58 +0400)]
bgpd: IPv4 MP-BGP Routes addition and deletion
This patch contains the following:
1. Addition of IPv4 SAFI_MULTICAST BGP routes into the BGP Multicast RIB.
2. Deletion of IPv4 SAFI_MULTICAST BGP routes from the BGP Multicast RIB.
Paul Jakma [Mon, 9 Jan 2012 11:36:23 +0000 (11:36 +0000)]
bgpd: reinstate zlookup checks, required for BGP without zebra
* bgp_nexthop.c: The nexthop lookup cache has to return success for queried
nexthops if bgpd isn't connected to zebra, or else BGP without zebra doesn't
work.
Paul Jakma [Sun, 8 Jan 2012 14:47:06 +0000 (14:47 +0000)]
Marker merge for 'RE-0.99.17.6'
This marker merge (i.e. an 'ours' strategy merge) is a placeholder to show
that all commits in Quagga-RE stable, to its release RE-0.99.17.6 tag, have
been reviewed and merged into 'master'.
Denis Ovsienko [Mon, 8 Aug 2011 15:36:44 +0000 (19:36 +0400)]
bgpd: dismiss some zlookup checks
bgp_nexthop_onlink(): zlookup is not used here at all
bgp_nexthop_lookup_ipv6(): rely on the detection performed by "query"
function (this also changes the fallback value to 0), reorder if-block
bgp_nexthop_lookup(): idem
Denis Ovsienko [Fri, 5 Aug 2011 17:47:08 +0000 (21:47 +0400)]
bgpd: add "show ip bgp scan detail" command
* bgp_nexthop.c: (show_ip_bgp_scan) transform into
show_ip_bgp_scan_tables(), which uses inet_ntop() and can dump
nexthops on request; (show_ip_bgp_scan_detail_cmd) new function
Denis Ovsienko [Fri, 5 Aug 2011 14:52:52 +0000 (18:52 +0400)]
bgpd: touch nexthop handling code
bgp_nexthop_lookup_ipv6(): declare variables where they are actually
used, drop no-op initialization (the field is already 0)
bgp_nexthop_lookup(): ditto
bgp_nexthop_check_ebgp(): rename to bgp_nexthop_onlink()
bgp_nexthop_cache_changed(): rename to bgp_nexthop_cache_different()
Paul Jakma [Fri, 6 Jan 2012 16:07:39 +0000 (16:07 +0000)]
lib/if: trivial, fix rarely used if debug function to print everything
* if.c: (if_dump) loop that doesn't do anything, wants to be
before the zlog of what it's meant to print out so all the connected
addresses get printed out. Trival: just a debug function
Paul Jakma [Fri, 8 Apr 2011 11:44:43 +0000 (12:44 +0100)]
general: remove inline qualifiers and move in-header functions to objects
* (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.
* fix disagreement with C99 in zlog_debug calls
Format specifier in some zlog_debug calls for size_t values
was changed in order to C99 ('%u' -> '%zu').
* fix -Wsign-compare warnings
Type of return value of ospf6_packet_max() was changed.
Tom Goff [Wed, 10 Nov 2010 21:03:02 +0000 (13:03 -0800)]
ospf6d: Route locking (memory) cleanup
* ospf6_route.c: (ospf6_route_best_next) Allows unlock route, even
when there's no next route. This is consistent with how
ospf6_route_next() behaves.
* ospf6_intra.c: (ospf6_intra_prefix_lsa_remove) Make sure the last
route considered is always unlocked. This is needed when the for
loop terminates because ospf6_route_is_prefix() returns zero.
Tom Goff [Wed, 10 Nov 2010 21:01:41 +0000 (13:01 -0800)]
ospf6d: Have ospf6d cleanup when it terminates normally
A clean exit makes it easier to use memory debuggers.
* ospf6_asbr.c: (ospf6_asbr_terminate) Add a function to do route map
cleanup.
* ospf6_lsa.c: (ospf6_lsa_terminate) Add a function to cleanup the lsa
handler vector.
* ospf6_main.c: (ospf6_exit) Add an function that causes ospf6d to
gracefully exit.
* ospf6_message.c: (ospf6_message_terminate) Add a function that frees
the send and receive buffers.
* ospf6_top.c: (ospf6_delete) Enable the ospf6_delete() function.
Disable ospf6 before freeing everything.
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.
* fix disagreement with C99 in zlog_debug calls
Format specifier in some zlog_debug calls for size_t values
was changed in order to C99 ('%u' -> '%zu').
* fix -Wsign-compare warnings
Type of return value of ospf6_packet_max() was changed.
Denis Ovsienko [Sun, 18 Dec 2011 12:27:02 +0000 (16:27 +0400)]
ospfd: fix bug in NSSA ABR status check
* ospf_abr.c
* ospf_abr_nssa_am_elected(): feed "best" instead of "address of best"
into IPV4_ADDR_CMP(), because "best" is a pointer; also, mean s_addr
field of the structures to get better typed pointers
Denis Ovsienko [Sun, 18 Dec 2011 11:40:17 +0000 (15:40 +0400)]
lib: address type-punned pointers in prefix_same()
IPV4_ADDR_SAME() wasn't passed the right union member, this could cause
a bug due to strict-aliasing. IPV6_ADDR_SAME() case got its fix before
the error could be created by macro upgrade.
Denis Ovsienko [Sat, 17 Dec 2011 15:39:30 +0000 (19:39 +0400)]
bgpd: justify checks for IPv4 class D/E
* lib/prefix.h
* IPV4_CLASS_DE(): make consistent with counterpart macros
* bgp_packet.c
* bgp_open_receive(): test using macro instead of ">="
* bgp_route.c
* bgp_update_rsclient(): idem
* bgp_update_main(): idem
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.
Denis Ovsienko [Sun, 4 Dec 2011 19:21:55 +0000 (23:21 +0400)]
lib: optimize ip_masklen()
The new implementation makes use of a 64KB mapping table, which makes it
possible to compute masklen faster and with constant execution time. The
map also allows for additional version of the function, which can detect
errors in input argument.
The previous implementation had a variable cost of execution, which
depended on masklen in a non-linear manner, and at its worst (/31) was
4 times slower, than the new implementation. The only case of old
function just slightly outperforming the new one is /0, which is of
little practical interest.
Denis Ovsienko [Sun, 18 Dec 2011 12:27:02 +0000 (16:27 +0400)]
ospfd: fix bug in NSSA ABR status check
* ospf_abr.c
* ospf_abr_nssa_am_elected(): feed "best" instead of "address of best"
into IPV4_ADDR_CMP(), because "best" is a pointer; also, mean s_addr
field of the structures to get better typed pointers
Denis Ovsienko [Sun, 18 Dec 2011 11:40:17 +0000 (15:40 +0400)]
lib: address type-punned pointers in prefix_same()
IPV4_ADDR_SAME() wasn't passed the right union member, this could cause
a bug due to strict-aliasing. IPV6_ADDR_SAME() case got its fix before
the error could be created by macro upgrade.
Denis Ovsienko [Sat, 17 Dec 2011 15:39:30 +0000 (19:39 +0400)]
bgpd: justify checks for IPv4 class D/E
* lib/prefix.h
* IPV4_CLASS_DE(): make consistent with counterpart macros
* bgp_packet.c
* bgp_open_receive(): test using macro instead of ">="
* bgp_route.c
* bgp_update_rsclient(): idem
* bgp_update_main(): idem
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.
bgpd: store nexthop info for redistributed IPV6 routes
BGP was ignoring nexthop info for static and other redistributed
routes for IPv6. Build extra attribute info to store the nexthop.
See also:
https://bugzilla.vyatta.com/show_bug.cgi?id=6073
ospfd: avoid redundant lookup in ospf_redistribute_withdraw
The old algorithim looked up every node twice as it withdrew
the entry. It looks up entry once in redistribute_withdraw, then
looks it up again info_delete. Use result of first lookup
to do the free directly.
This may explain the slow performance observed in
https://bugzilla.vyatta.com/show_bug.cgi?id=4421
lib: call filter delete hook before freeing access list
The delete_hook was being run after calling access list delete function.
This would cause ospf to dereference a NULL, in ospf_filter_update
because 'access->name' was already freed.
See also:
https://bugzilla.vyatta.com/show_bug.cgi?id=7654
Denis Ovsienko [Sun, 4 Dec 2011 19:21:55 +0000 (23:21 +0400)]
lib: optimize ip_masklen()
The new implementation makes use of a 64KB mapping table, which makes it
possible to compute masklen faster and with constant execution time. The
map also allows for additional version of the function, which can detect
errors in input argument.
The previous implementation had a variable cost of execution, which
depended on masklen in a non-linear manner, and at its worst (/31) was
4 times slower, than the new implementation. The only case of old
function just slightly outperforming the new one is /0, which is of
little practical interest.
(This patch was modified to leave calls to stream_getl() in place, they
are necessary for the stream's internal pointer to advance to the
correct position. -- Denis)
Signed-off-by: Denis Ovsienko <infrastation@yandex.ru>
Fix gcc warnings about varables that are set but never used.
Denis Ovsienko [Fri, 14 Oct 2011 17:59:58 +0000 (21:59 +0400)]
ospf6d: decode message type with LOOKUP()
* ospf6_message.h
* OSPF6_MESSAGE_TYPE_CANONICAL(): dismiss
* OSPF6_MESSAGE_TYPE_NAME(): dismiss
* ospf6_message.c
* ospf6_message_type_str: rewrite as a message list, add max value
* ospf6_packet_examin(): update to use LOOKUP()
* ospf6_receive(): idem
* ospf6_send(): idem
Denis Ovsienko [Sat, 8 Oct 2011 13:22:45 +0000 (17:22 +0400)]
ospf6d: make some old sizing checks assertions
As long as ospf6_packet_examin() is now the single checkpoint for
received packets, most of the old checks performed elsewhere can
be converted into assert() constructs. Malformed input data at
respective points can be attributed solely to a programming error,
not a malformed packet.
David Lamparter [Sun, 4 Oct 2009 14:21:49 +0000 (16:21 +0200)]
lib: add sockopt helper for setting IPV6_V6ONLY and use it
getaddrinfo returns a list of socket parameters for listening. it
will contain both IPv4 and IPv6 listening sockets. unless we use
IPV6_V6ONLY on the IPv6 ones, only the socket listed first will
work. if the IPv4 one came first, the IPv6 one would get an
"Address in use" error.
this functionality was already present for bgpd and its listening
sockets. as it is needed for vtys as well, make it a common helper.
David Lamparter [Tue, 15 Sep 2009 23:52:42 +0000 (01:52 +0200)]
lib: put route_types.txt to real use
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.
David Lamparter [Wed, 26 Aug 2009 22:28:28 +0000 (00:28 +0200)]
rib: default distance value for new protocols (v2)
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)
Tom Goff [Wed, 25 Nov 2009 20:36:06 +0000 (20:36 +0000)]
zebra: set the interface link-layer socket address
* kernel_socket.c: (ifm_read) The reorganization from commit 6fe70d1b35c189cb1e488b2c26551ba7baac6148 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().
Ulrich Weber [Wed, 16 Nov 2011 15:32:12 +0000 (19:32 +0400)]
bgp: use VTY_GET_INTEGER_RANGE() in bgp_clear()
Second patch replaces "VTY_GET_LONG ("AS", as_ul, arg);"
by "VTY_GET_INTEGER_RANGE ("AS", as, arg, 1, BGP_AS4_MAX);"
as done in all other code, which parses AS numbers.