Properly implement 'rde med compare strict' and make sure that the order
authorclaudio <claudio@openbsd.org>
Tue, 2 Feb 2021 15:24:43 +0000 (15:24 +0000)
committerclaudio <claudio@openbsd.org>
Tue, 2 Feb 2021 15:24:43 +0000 (15:24 +0000)
commit42f9861b32633ba678204917a0a74c266b2a8c17
treea2a10585e7fe64c02111cd5573f8005be0579661
parent8d85952c766295619ff208c0b0ea6f20ee45c643
Properly implement 'rde med compare strict' and make sure that the order
of prefixes is always correct. The strict RFC4271 way of checking MED is
requires to check the neighbor AS and only do the check if the AS are equal.
Because of this it is possible that inserting or removing a route reshuffles
the total order.

prefix_cmp() was extended to return the location where the decision happened:
- 0 if the decision was before the MED comparison or med compare always is set
- 1 if the decision happened after the MED comparison
- 2 if the MED made caused the decision

With this the new functions prefix_insert() and prefix_remove() are able
to decide if more prefixes need to be evaluated (testall was not 0.) and
if prefixes need to be re-evaluated after this one was put (testall = 2).
There is a local redo list where prefixes where the MED resulted in a
reshuffle are put on. After the new prefix is inserted all prefixes on
the redo list are reinserted. Because now all affected MED routes get
reevaluated the order is always correct.
usr.sbin/bgpd/rde_decide.c