mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-02 23:52:18 +00:00
![]() 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> |
||
---|---|---|
.. | ||
.gitignore | ||
BGP4-MIB.txt | ||
bgp_advertise.c | ||
bgp_advertise.h | ||
bgp_aspath.c | ||
bgp_aspath.h | ||
bgp_attr.c | ||
bgp_attr.h | ||
bgp_btoa.c | ||
bgp_clist.c | ||
bgp_clist.h | ||
bgp_community.c | ||
bgp_community.h | ||
bgp_damp.c | ||
bgp_damp.h | ||
bgp_debug.c | ||
bgp_debug.h | ||
bgp_dump.c | ||
bgp_dump.h | ||
bgp_ecommunity.c | ||
bgp_ecommunity.h | ||
bgp_filter.c | ||
bgp_filter.h | ||
bgp_fsm.c | ||
bgp_fsm.h | ||
bgp_main.c | ||
bgp_mpath.c | ||
bgp_mpath.h | ||
bgp_mplsvpn.c | ||
bgp_mplsvpn.h | ||
bgp_network.c | ||
bgp_network.h | ||
bgp_nexthop.c | ||
bgp_nexthop.h | ||
bgp_open.c | ||
bgp_open.h | ||
bgp_packet.c | ||
bgp_packet.h | ||
bgp_regex.c | ||
bgp_regex.h | ||
bgp_route.c | ||
bgp_route.h | ||
bgp_routemap.c | ||
bgp_snmp.c | ||
bgp_snmp.h | ||
bgp_table.c | ||
bgp_table.h | ||
bgp_vty.c | ||
bgp_vty.h | ||
bgp_zebra.c | ||
bgp_zebra.h | ||
bgpd.c | ||
bgpd.conf.sample | ||
bgpd.conf.sample2 | ||
bgpd.h | ||
IMPLEMENTATION.txt | ||
Makefile.am |