mirror_frr/bgpd
Donald Sharp 5e242b0dd3 cluster-id length equality for multipath
A fat tree topology running IBGP gets into two issues with anycast address
routing. Consider the following topology:

        R9   R10
          x x
  R3   R4     R7   R8
     x           x
  R1   R2     R5   R6
  |    |      |    |
 10/8 10/8  10/8   S

Let's remind ourselves of BGP decision process steps:

1. Highest Local Preference
2. Shortest AS Path Length
3. Lowest Origin Type
4. Lowest MED (Multi-Exit Discriminator)
5. Prefer External to Internal
6. Closest Egress (Lowest IGP Distance)
7. Tie Breaking (Lowest-Router-ID)
8. Tie Breaking (Lowest-cluster-list length)
9. Tie Breaking (Lowest-neighbor-address)

Without any policies, steps 1-6 will almost always evaluate identically for
all paths received on any router in the above topology. Let's assume that
the router-ids follow the following inequality: R1 < R2 < R5 < R6. Owing to
the 7th step above, all routers will now choose R1's path as the best. This
is undesirable. As an example, traffic from S to 10/8 will follow the path
S -> R6 -> R7 -> R9 -> R4 -> R2 -> 10/8 instead of S -> R6 -> R7 -> R5 -> 10/8.
Furthermore, once R7 (& R8) chooses R1's path as the best, it would withdraw
its path learned through (R5, R6) from (R9, R10). This leads to inefficient
load balancing - e.g. R9 can't do ECMP across all available egresses -
(R1, R2, R5).

The patch addresses these issues by noting that that cluster list is always
carried along with the routes and its length is a good indicator of IBGP
hops. It thus makes sense to compare that as an extension to metric after
step 6. That automatically ensures correct multipath computation.

Unfortunately a partial deployment of this in a generic topology (note:
fat-tree/clos topologies work fine) may lead to potential loops. It needs
to be looked into.

Signed-off-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-19 17:40:31 -07:00
..
.gitignore [administrivia] Update gitignore files 2008-08-22 20:02:08 +01:00
BGP4-MIB.txt Initial revision 2002-12-13 20:15:29 +00:00
bgp_advertise.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_advertise.h 2005-06-28 Paul Jakma <paul.jakma@sun.com> 2005-06-28 12:44:16 +00:00
bgp_aspath.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_aspath.h bgpd: optimize aspath string representation and assegments handling 2012-05-22 20:25:02 +02:00
bgp_attr.c bgpd: don't send NOTIFY twice for malformed attrs 2014-06-29 12:47:21 +02:00
bgp_attr.h cluster-id length equality for multipath 2015-05-19 17:40:31 -07:00
bgp_btoa.c Initial revision 2002-12-13 20:15:29 +00:00
bgp_clist.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_clist.h [bgpd] Stability fixes including bugs 397, 492 2009-07-19 18:28:08 +01:00
bgp_community.c bgpd: memmove needed in community_del_val 2014-08-18 01:52:26 +02:00
bgp_community.h Revert "bgpd: "Intern" communities in route maps" 2011-04-01 15:58:27 +01:00
bgp_damp.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_damp.h Fix "show ip bgp dampened-paths" garbage output. 2009-06-23 14:25:20 +01:00
bgp_debug.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_debug.h [bgpd/cleanup] make message lists read only 2009-06-18 20:18:29 +01:00
bgp_dump.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_dump.h [bgpd] Stability fixes including bugs 397, 492 2009-07-19 18:28:08 +01:00
bgp_ecommunity.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_ecommunity.h Merge branch 'quagga' into google-bgp-multipath 2012-04-09 00:25:15 -07:00
bgp_filter.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_filter.h bgp: compiler warning fix 2009-08-13 09:59:58 +01:00
bgp_fsm.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_fsm.h [bgpd] Bug #302 fixes. ClearingCompleted event gets flushed, leaving peers stuck in Clearing. 2006-10-15 23:39:59 +00:00
bgp_main.c Enable support for BGP IPV6 multipath. 2015-05-19 17:24:44 -07:00
bgp_mpath.c cluster-id length equality for multipath 2015-05-19 17:40:31 -07:00
bgp_mpath.h cluster-id length equality for multipath 2015-05-19 17:40:31 -07:00
bgp_mplsvpn.c bgpd: Fix memory leak of some "show ip bgp neighbor" commands 2012-05-02 17:03:27 +02:00
bgp_mplsvpn.h 2005-06-28 Paul Jakma <paul.jakma@sun.com> 2005-06-28 12:44:16 +00:00
bgp_network.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_network.h bgpd: increase TCP socket buffer size 2014-05-15 20:34:53 +02:00
bgp_nexthop.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_nexthop.h bgpd: optimize bgp_nexthop_self() 2012-05-22 20:25:07 +02:00
bgp_open.c bgpd: relax ORF capability length handling 2013-02-01 17:55:04 +01:00
bgp_open.h bgpd, lib: adopt afi_t and safi_t in several places 2010-10-06 12:33:05 -04:00
bgp_packet.c bgpd: fix memory leak on malformed attribute 2014-06-29 12:47:21 +02:00
bgp_packet.h bgpd: code cleanup 2009-12-17 13:14:28 +03:00
bgp_regex.c [bgpd] Pass NOSUB to regexec 2007-08-23 23:22:02 +00:00
bgp_regex.h [configure] add configure support for PCRE Posix library 2009-06-19 15:01:16 +01:00
bgp_route.c cluster-id length equality for multipath 2015-05-19 17:40:31 -07:00
bgp_route.h Merge branch 'quagga' into google-bgp-multipath 2012-04-09 00:25:15 -07:00
bgp_routemap.c Add set ipv6 next-hop peer-address command. 2015-05-19 17:24:45 -07:00
bgp_snmp.c *: nuke ^L (page feed) 2014-06-04 06:58:02 +02:00
bgp_snmp.h 2005-06-28 Paul Jakma <paul.jakma@sun.com> 2005-06-28 12:44:16 +00:00
bgp_table.c bgpd: make bgp_table a wrapper around table library 2012-09-26 21:50:48 +02:00
bgp_table.h lib/table: add route_table_get_next() and iterator 2012-09-26 21:50:48 +02:00
bgp_vty.c cluster-id length equality for multipath 2015-05-19 17:40:31 -07:00
bgp_vty.h [bgpd] Merge AS4 support 2007-10-14 22:32:21 +00:00
bgp_zebra.c IPv6 multipath is broken in BGP if nexthop contains only global address. 2015-05-19 17:24:45 -07:00
bgp_zebra.h Enable support for BGP IPV6 multipath. 2015-05-19 17:24:44 -07:00
bgpd.c bgpd: implement "next-hop-self all" 2014-06-25 21:20:20 +03:00
bgpd.conf.sample Initial revision 2002-12-13 20:15:29 +00:00
bgpd.conf.sample2 Initial revision 2002-12-13 20:15:29 +00:00
bgpd.h cluster-id length equality for multipath 2015-05-19 17:40:31 -07:00
IMPLEMENTATION.txt Adjust size complexity estimates. Still not quite right, but closer. 2005-02-15 17:10:03 +00:00
Makefile.am build: use net-snmp-config to configure NetSNMP 2012-06-25 19:03:23 +02:00