summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFernando Fernandez Mancera <ffmancera@riseup.net>2022-12-22 17:58:12 +0100
committerFernando Fernandez Mancera <ffmancera@riseup.net>2022-12-23 16:47:29 +0100
commit8b27a2b09a3cbfe78480d85a7ca32d062ace6737 (patch)
tree43a444e61e01ef119b443d3aecb11f06796c6bb0
parent737cb5d424e397901a5ad979907a084f770dd8d4 (diff)
downloadNetworkManager-8b27a2b09a3cbfe78480d85a7ca32d062ace6737.tar.gz
nm-netns: mark the ECMP route as needs_update when registering
If an L3Cfg try to register an ECMP route that we are tracking we must mark it as needs_update because it means it could be dropped from kernel. When merging them if the merged route didn't change we should commit the route anyway because we know it needed update.
-rw-r--r--src/core/nm-netns.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/core/nm-netns.c b/src/core/nm-netns.c
index 0b775ce268..c17adf6c74 100644
--- a/src/core/nm-netns.c
+++ b/src/core/nm-netns.c
@@ -209,7 +209,10 @@ _ecmp_track_init_merged_obj(EcmpTrackEcmpid *track_ecmpid, const NMPObject **out
out:
nm_assert(obj_new);
if (nmp_object_equal(track_ecmpid->merged_obj, obj_new))
- return FALSE;
+ /* the objects are equal but the update was needed, for example if the
+ * routes were removed from kernel but not from our tracking
+ * dictionaries and therefore we tried to register them again. */
+ return TRUE;
if (track_ecmpid->merged_obj)
*out_obj_del = g_steal_pointer(&track_ecmpid->merged_obj);
@@ -614,8 +617,10 @@ nm_netns_ip_route_ecmp_register(NMNetns *self, NML3Cfg *l3cfg, const NMPObject *
_LOGT(
"ecmp-route: track %s",
nmp_object_to_string(track_obj->obj, NMP_OBJECT_TO_STRING_PUBLIC, sbuf, sizeof(sbuf)));
- } else
- track_obj->dirty = FALSE;
+ } else {
+ track_obj->dirty = FALSE;
+ track_obj->parent_track_ecmpid->needs_update = TRUE;
+ }
}
void