summaryrefslogtreecommitdiff
path: root/lib/xref.c
diff options
context:
space:
mode:
authorStephen Worley <sworley@nvidia.com>2021-01-27 16:20:22 -0500
committerStephen Worley <sworley@nvidia.com>2021-02-01 13:02:40 -0500
commit3d30f6defb5d0c6bc4d016b8eca114c4198acbbe (patch)
treeeb5a654c1dc05cb368cba5cec5de4bccf75ee4b9 /lib/xref.c
parent3d3ed04d39390dc01cdebfc3b6aac523d63b4c5d (diff)
zebra: disallow resolution to duplicate nexthops
Disallow the resolution to nexthops that are marked duplicate. When we are resolving to an ecmp group, it's possible this group has duplicates. I found this when I hit a bug where we can have groups resolving to each other and cause the resolved->next->next pointer to increase exponentially. Sufficiently large ecmp and zebra will grind to a hault. Like so: ``` D> 4.4.4.14/32 [150/0] via 1.1.1.1 (recursive), weight 1, 00:00:02 * via 1.1.1.1, dummy1 onlink, weight 1, 00:00:02 via 4.4.4.1 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.2 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.3 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.4 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.5 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.6 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.7 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.8 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.9 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.10 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.11 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.12 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.13 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.15 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1 onlink, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1 onlink, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 4.4.4.16 (recursive), weight 1, 00:00:02 via 1.1.1.1, dummy1 onlink, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 via 1.1.1.1, dummy1, weight 1, 00:00:02 D> 4.4.4.15/32 [150/0] via 1.1.1.1 (recursive), weight 1, 00:00:09 * via 1.1.1.1, dummy1 onlink, weight 1, 00:00:09 via 4.4.4.1 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.2 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.3 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.4 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.5 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.6 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.7 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.8 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.9 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.10 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.11 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.12 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.13 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.14 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 4.4.4.16 (recursive), weight 1, 00:00:09 via 1.1.1.1, dummy1 onlink, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 via 1.1.1.1, dummy1, weight 1, 00:00:09 D> 4.4.4.16/32 [150/0] via 1.1.1.1 (recursive), weight 1, 00:00:19 * via 1.1.1.1, dummy1 onlink, weight 1, 00:00:19 via 4.4.4.1 (recursive), weight 1, 00:00:19 via 1.1.1.1, dummy1, weight 1, 00:00:19 via 4.4.4.2 (recursive), weight 1, 00:00:19 ............... ................ and on... ``` You can repro the above via: ``` kernel routes: 1.1.1.1 dev dummy1 scope link 4.4.4.0/24 via 1.1.1.1 dev dummy1 ============================== config: nexthop-group doof nexthop 1.1.1.1 nexthop 4.4.4.1 nexthop 4.4.4.10 nexthop 4.4.4.11 nexthop 4.4.4.12 nexthop 4.4.4.13 nexthop 4.4.4.14 nexthop 4.4.4.15 nexthop 4.4.4.16 nexthop 4.4.4.2 nexthop 4.4.4.3 nexthop 4.4.4.4 nexthop 4.4.4.5 nexthop 4.4.4.6 nexthop 4.4.4.7 nexthop 4.4.4.8 nexthop 4.4.4.9 ! =========================== Then use sharpd to install 4.4.4.16 -> 4.4.4.1 pointing to that nexthop group in decending order. ``` With these changes it prevents the growing ecmp above by disallowing duplicates to be in the resolution decision. These nexthops are not installed anyways so why should we be resolving to them? Signed-off-by: Stephen Worley <sworley@nvidia.com>
Diffstat (limited to 'lib/xref.c')
0 files changed, 0 insertions, 0 deletions