mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-19 13:33:40 +00:00
babeld: change the modify route system.
Zebra doesn't set errno to EEXIST if we add a route who was already in the kernel, so we always returned after just doing "add; delete". This patch fix the problem by doing "delete; add" always.
This commit is contained in:
parent
6dfeb3f6cf
commit
ec8d8d5ba6
@ -142,26 +142,7 @@ kernel_route(int operation, const unsigned char *pref, unsigned short plen,
|
||||
if(newmetric == metric && memcmp(newgate, gate, 16) == 0 &&
|
||||
newifindex == ifindex)
|
||||
return 0;
|
||||
/* It is better to add the new route before removing the old
|
||||
one, to avoid losing packets. However, if the old and new
|
||||
priorities are equal, this only works if the kernel supports
|
||||
ECMP. So we first try the "right" order, and fall back on
|
||||
the "wrong" order if it fails with EEXIST. */
|
||||
rc = ipv4 ?
|
||||
kernel_route_add_v4(pref, plen,
|
||||
newgate, newifindex, newmetric,
|
||||
NULL, 0, 0):
|
||||
kernel_route_add_v6(pref, plen,
|
||||
newgate, newifindex, newmetric,
|
||||
NULL, 0, 0);
|
||||
if(rc < 0) {
|
||||
if(errno != EEXIST)
|
||||
return rc;
|
||||
added = 0;
|
||||
} else {
|
||||
added = 1;
|
||||
}
|
||||
|
||||
debugf(BABEL_DEBUG_ROUTE, "Modify route: delete old; add new.");
|
||||
if (ipv4) {
|
||||
kernel_route_delete_v4(pref, plen,
|
||||
gate, ifindex, metric,
|
||||
@ -172,7 +153,6 @@ kernel_route(int operation, const unsigned char *pref, unsigned short plen,
|
||||
NULL, 0, 0);
|
||||
}
|
||||
|
||||
if(!added) {
|
||||
rc = ipv4 ?
|
||||
kernel_route_add_v4(pref, plen,
|
||||
newgate, newifindex, newmetric,
|
||||
@ -187,7 +167,6 @@ kernel_route(int operation, const unsigned char *pref, unsigned short plen,
|
||||
route on failure to preserve. However, this should
|
||||
hopefully not matter much in practice. */
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user