From nobody Fri Jan 13 21:25:42 2023 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4NtvbW0vFnz2qky2; Fri, 13 Jan 2023 21:25:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4NtvbW0BsYz43gY; Fri, 13 Jan 2023 21:25:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673645143; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Nu83sGdhyjc/9I0m63dhPWIpZcjsjgAlQ8vCafbx5N4=; b=brrYuvdk5is99+3n79tA1G+m8tnGliy88X2Vqx7fr6cc6SBUW0jzyCSfvlW5MOj0ysQDf8 JrMJxl5VlN6M8e3DnKZP3LOFG/euWMyT684jLaSHQ7cESbrCBukjv2wIpGgc4Xg8ReLHxK 8pYDbo/dlOvD6y7rDG93drJ1JJR2215atQumVZdx4NdMYZa1rxx3cBxlBB9XgpDMzq/FF3 syepZAbAqjq6SGaf8jDXSmHf2GHCjybW2EX/7dtTzYFtYWyjs747JgUrabqEmQlX5k1Cxw NxflviAd20DIpq1wpZtOnTcvJtSOiPSJ45wT7xJxEaETJXfqEulafZArB/rpZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673645143; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Nu83sGdhyjc/9I0m63dhPWIpZcjsjgAlQ8vCafbx5N4=; b=GYiUd5WdIBvi4kn8XnYqmAVedZ556ahPqMl2N0no9wUzEDlaUK7UuQxkcBSATdwgHT9udz uKZ5hBDDX+mHa4SBi6YGhzT5nGfH+pvmM9KuDKvLivgJ0bYJHcZZNbLkSoReRaACDHh6HD FDnTOOeTshazLNJnsCF0lf37l3qLKnVUHHHprR+J4CC88yf2nbzpTgjZxiy7+blNjUVm3h zqEe2KbViV59xAl3FI/DPX+PFDImnXlz3Cyjywjqzq7k7+y231HduJ4jWacSv7dR713dSn WU8BpS6o+1+3whzhPYM7qZSYZ96RcNUC/QrpynydDXmIt7sBSt+uOC8BdD4uaA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1673645143; a=rsa-sha256; cv=none; b=vp8pu7jV3X1iry6HL0wSokFnbibxwyrJ9tf2LNhEU1uX8KoXpqaUqJ0odFjRmKDl6T4tIW cd1MAOlExrY4bbOP9pwLqZmvkRtjnLRBhJk42pOp5hpG8x9NVTF+i4e2DeNepy0BIHdypu Siiu1HBGQ3sJjrDLqR7CkSE2LHuL8h++3jHfZVD/CEbrBQNkvp5/WqNkTLGXfMgwIA2/0O +qLce2IU4EwUPAhet+yCFS3TfxtDW6rdVqBpUxxP8QEFqw2kG6jVNH5QkozG72AJPvemqb vRibbUomb4uXap7t2pi7vBDZzA2NPgq199g/3jr7J42mxeRd7q0HWkwzWpUMhg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4NtvbV6L2vzNBc; Fri, 13 Jan 2023 21:25:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30DLPgHN042226; Fri, 13 Jan 2023 21:25:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30DLPgwt042225; Fri, 13 Jan 2023 21:25:42 GMT (envelope-from git) Date: Fri, 13 Jan 2023 21:25:42 GMT Message-Id: <202301132125.30DLPgwt042225@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 4907fce612c0 - stable/13 - netinet6: simplify defrouter_select_fib() List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 4907fce612c04077848074cd1fe921d8423dcd17 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=4907fce612c04077848074cd1fe921d8423dcd17 commit 4907fce612c04077848074cd1fe921d8423dcd17 Author: Alexander V. Chernikov AuthorDate: 2022-08-12 11:43:14 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-01-13 21:24:11 +0000 netinet6: simplify defrouter_select_fib() * factor out underlying llentry check into a separate function and use it consistently * enter epoch once instead of per-router enter/exit * don't execute body with fibnum = `RT_ALL_FIBS` Differential Revision: https://reviews.freebsd.org/D35523 MFC after: 2 weeks (cherry picked from commit 9d16275c65bfe0f577e6f97397e024a33169acc9) --- sys/netinet6/nd6_rtr.c | 51 ++++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index 19eacadb99f7..6d3993a3bce6 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -916,6 +916,18 @@ rtpref(struct nd_defrouter *dr) /* NOTREACHED */ } +static bool +is_dr_reachable(const struct nd_defrouter *dr) { + struct llentry *ln = NULL; + + ln = nd6_lookup(&dr->rtaddr, LLE_SF(AF_INET6, 0), dr->ifp); + if (ln == NULL) + return (false); + bool reachable = ND6_IS_LLINFO_PROBREACH(ln); + LLE_RUNLOCK(ln); + return reachable; +} + /* * Default Router Selection according to Section 6.3.6 of RFC 2461 and * draft-ietf-ipngwg-router-selection: @@ -946,12 +958,12 @@ defrouter_select_fib(int fibnum) { struct epoch_tracker et; struct nd_defrouter *dr, *selected_dr, *installed_dr; - struct llentry *ln = NULL; if (fibnum == RT_ALL_FIBS) { for (fibnum = 0; fibnum < rt_numfibs; fibnum++) { defrouter_select_fib(fibnum); } + return; } ND6_RLOCK(); @@ -970,21 +982,17 @@ defrouter_select_fib(int fibnum) * the ordering rule of the list described in defrtrlist_update(). */ selected_dr = installed_dr = NULL; + NET_EPOCH_ENTER(et); TAILQ_FOREACH(dr, &V_nd6_defrouter, dr_entry) { - NET_EPOCH_ENTER(et); - if (selected_dr == NULL && dr->ifp->if_fib == fibnum && - (ln = nd6_lookup(&dr->rtaddr, LLE_SF(AF_INET6, 0), dr->ifp)) && - ND6_IS_LLINFO_PROBREACH(ln)) { + if (dr->ifp->if_fib != fibnum) + continue; + + if (selected_dr == NULL && is_dr_reachable(dr)) { selected_dr = dr; defrouter_ref(selected_dr); } - NET_EPOCH_EXIT(et); - if (ln != NULL) { - LLE_RUNLOCK(ln); - ln = NULL; - } - if (dr->installed && dr->ifp->if_fib == fibnum) { + if (dr->installed) { if (installed_dr == NULL) { installed_dr = dr; defrouter_ref(installed_dr); @@ -998,6 +1006,7 @@ defrouter_select_fib(int fibnum) } } } + /* * If none of the default routers was found to be reachable, * round-robin the list regardless of preference. @@ -1022,22 +1031,14 @@ defrouter_select_fib(int fibnum) } } } else if (installed_dr != NULL) { - NET_EPOCH_ENTER(et); - if ((ln = nd6_lookup(&installed_dr->rtaddr, 0, - installed_dr->ifp)) && - ND6_IS_LLINFO_PROBREACH(ln) && - installed_dr->ifp->if_fib == fibnum && + if (is_dr_reachable(installed_dr) && rtpref(selected_dr) <= rtpref(installed_dr)) { defrouter_rele(selected_dr); selected_dr = installed_dr; } - NET_EPOCH_EXIT(et); - if (ln != NULL) - LLE_RUNLOCK(ln); } ND6_RUNLOCK(); - NET_EPOCH_ENTER(et); /* * If we selected a router for this FIB and it's different * than the installed one, remove the installed router and @@ -1808,20 +1809,12 @@ find_pfxlist_reachable_router(struct nd_prefix *pr) { struct epoch_tracker et; struct nd_pfxrouter *pfxrtr; - struct llentry *ln; - int canreach; ND6_LOCK_ASSERT(); NET_EPOCH_ENTER(et); LIST_FOREACH(pfxrtr, &pr->ndpr_advrtrs, pfr_entry) { - ln = nd6_lookup(&pfxrtr->router->rtaddr, LLE_SF(AF_INET6, 0), - pfxrtr->router->ifp); - if (ln == NULL) - continue; - canreach = ND6_IS_LLINFO_PROBREACH(ln); - LLE_RUNLOCK(ln); - if (canreach) + if (is_dr_reachable(pfxrtr->router)) break; } NET_EPOCH_EXIT(et);