From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=none dis=none) header.from=mur.at Authentication-Results: passt.top; dkim=pass (3072-bit key; unprotected) header.d=mur.at header.i=@mur.at header.a=rsa-sha256 header.s=dkim2 header.b=ln9nuMPP; dkim-atps=neutral Received: from efeu.mur.at (efeu.mur.at [89.106.208.42]) by passt.top (Postfix) with ESMTPS id B74D15A0265 for ; Tue, 08 Sep 2026 18:53:50 +0200 (CEST) Received: from raspi4 (lan1.raspi.ma39.ffgraz.net [10.12.1.243]) by efeu.mur.at (Postfix) with ESMTPSA id 6CE7946F21; Tue, 8 Sep 2026 18:53:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mur.at; s=dkim2; t=1788886430; bh=iu8rgNMQKpRGQKMciGd3wuYP/p3riYplbLBQrkrjWcc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ln9nuMPP1rDIbm8YycXpMaBqc112167tdMwnBOtMHrOh1U9WR+d0phSuWT3ChMDPy ZFBnRvRnBhJlC1ftwliK1SzZD04GL+812YgbWR5bHCl7R4T5rBE59N/c2HRPFkq3Oq 8zL2tMu5yX6t1RNn6b7X4s1T/WMn+Vwrr+ffqaAMubvRAz6luAcrfdp4wv74r7jCFT ajAO3xVsseNYro134otqtzsFZlkKrPq2UnpsLLDw1LZGUp6KYkUnAvKvs8t2SSLbp+ NhbT1BFdVKLRtasZROzbZEMY7dk8DCj2CMq3mZPkmiPMXLo0w80UOzVeAAu5AZMhzR vBgW+pnMHxVujS5i/Y3YcNlV9DOQ+OtoSLGNcJ4c1BqZdriKsuzCxwmSjFJjuucayG Lq7I7a58BM76e9E/tgkmpCSJZREL3XpOfH6brcNP2YfMUOvZSyzvE7WmlLamQrP/8q 8QbLfBBHYWVgwV/Ej2h5MsTWAI0mKV92gu1ELyTxbvLW440s/PI From: Martin Schitter To: passt-dev@passt.top Subject: [PATCH 3/3] Optimize route dependency solver. Date: Tue, 8 Sep 2026 16:52:24 +0000 Message-ID: <20260908165322.521274-4-ms+git@mur.at> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908165322.521274-1-ms+git@mur.at> References: <20260908165322.521274-1-ms+git@mur.at> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-MailFrom: ms+git@mur.at X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation Message-ID-Hash: PMSJNRPRT2ZREMBBLFFKSPOOE3XF6OPU X-Message-ID-Hash: PMSJNRPRT2ZREMBBLFFKSPOOE3XF6OPU X-Mailman-Approved-At: Tue, 08 Sep 2026 22:39:37 +0200 CC: Martin Schitter X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Avoid retransmitting routes that explicitly got reported as already existing. Never make more resolution attempts than there are still unresolved dependency errors. In the context of my current mesh network with ~700 route entries these changes reduce the required processing time from 5.5s to 15ms. --- netlink.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/netlink.c b/netlink.c index 2b49fe3..1cbe5e5 100644 --- a/netlink.c +++ b/netlink.c @@ -703,13 +703,12 @@ int nl_route_dup(int s_src, unsigned int ifi_src, /* Routes might have dependencies between each other, and the kernel * processes RTM_NEWROUTE messages sequentially. For n routes, we might - * need to send the requests up to n times to get all of them inserted. - * Routes that have been already inserted will return -EEXIST, but we - * can safely ignore that and repeat the requests. This avoids the need - * to calculate dependencies: let the kernel do that. + * need to send the requests up to n times in the worst case to get all + * of them inserted. */ clock_gettime(CLOCK_MONOTONIC, &start); - for (i = 0; i < dup_routes; i++) { + for (i = dup_routes; i > 0; i--) { + int dep_errors = 0; for (nh = (struct nlmsghdr *)buf, left = nlmsgs_size; NLMSG_OK(nh, left); nh = NLMSG_NEXT(nh, left)) { @@ -722,10 +721,22 @@ int nl_route_dup(int s_src, unsigned int ifi_src, rc = nl_do(s_dst, nh, RTM_NEWROUTE, (flags & ~NLM_F_DUMP_FILTERED) | NLM_F_CREATE, nh->nlmsg_len); - if (rc < 0 && rc != -EEXIST && - rc != -ENETUNREACH && rc != -EHOSTUNREACH) + + if ( rc == -EEXIST) { + /* Exclude existing routes from further retry attempts */ + nh->nlmsg_type = NLMSG_NOOP; + } + if ( rc == -ENETUNREACH || rc == -EHOSTUNREACH){ + dep_errors++; + continue; + } + if (rc < 0) return rc; } + debug("route dependency errors: %d", dep_errors); + /* Avoid having much more resolution attempts than + * there are still unresolved dependency errors */ + i = MIN(i, dep_errors++); } clock_gettime(CLOCK_MONOTONIC, &now); debug("route dependency handling time: %f s", -- 2.53.0