mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-19 15:16:00 +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 &&
|
if(newmetric == metric && memcmp(newgate, gate, 16) == 0 &&
|
||||||
newifindex == ifindex)
|
newifindex == ifindex)
|
||||||
return 0;
|
return 0;
|
||||||
/* It is better to add the new route before removing the old
|
debugf(BABEL_DEBUG_ROUTE, "Modify route: delete old; add new.");
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ipv4) {
|
if (ipv4) {
|
||||||
kernel_route_delete_v4(pref, plen,
|
kernel_route_delete_v4(pref, plen,
|
||||||
gate, ifindex, metric,
|
gate, ifindex, metric,
|
||||||
@ -172,7 +153,6 @@ kernel_route(int operation, const unsigned char *pref, unsigned short plen,
|
|||||||
NULL, 0, 0);
|
NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!added) {
|
|
||||||
rc = ipv4 ?
|
rc = ipv4 ?
|
||||||
kernel_route_add_v4(pref, plen,
|
kernel_route_add_v4(pref, plen,
|
||||||
newgate, newifindex, newmetric,
|
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
|
route on failure to preserve. However, this should
|
||||||
hopefully not matter much in practice. */
|
hopefully not matter much in practice. */
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user