From nobody Sat Feb 19 14:22:34 2022 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 E608A19CCEA7; Sat, 19 Feb 2022 14:22:34 +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 4K19kf5rD4z4dwT; Sat, 19 Feb 2022 14:22:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645280554; 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=wEQNQ4U4j49lXasychkNfLHCUZTH2QfI2rZ3clKG/hg=; b=f9A48Ik8BaoR+rFTVbdAibp3rPJHzbWNgDvqUAosc39Tm46QcLsY6LrdbohcZK2Gkg0g4L AB2yY9EkRAhLVN3fOld1SItTmpmXSEFanzYI+p33LvgEnLIne2Stik432tGcmIDKA7nukd qUVy21pPFwsLKSg5AD57dUmpMn7f+0RyG9PgkM+mageM170EpOmfovObhuTfj280EdIg1J UGpWtKfROLejMsi4+vKf+J8T9ywQUQzMCo18HUA9vEvayfv6gSk3hAuSKMg7x8ctqzqEGJ 1I9WXxIvXRvo0FesLS+m3mlCG6cWoU6I59MdSiXeCPGjQsNaJmO0WtZSlzCw8Q== 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 A43A126C8; Sat, 19 Feb 2022 14:22:34 +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 21JEMYsV071812; Sat, 19 Feb 2022 14:22:34 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 21JEMYiq071809; Sat, 19 Feb 2022 14:22:34 GMT (envelope-from git) Date: Sat, 19 Feb 2022 14:22:34 GMT Message-Id: <202202191422.21JEMYiq071809@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kristof Provost Subject: git: ab2c8a52a3a9 - stable/12 - pf: deal with tables gaining or losing counters 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: kp X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: ab2c8a52a3a983e48cdd3f31191e577fbf571535 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645280554; 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=wEQNQ4U4j49lXasychkNfLHCUZTH2QfI2rZ3clKG/hg=; b=HCo4v0YmMbLQxqA6nBZJmBYPe783hyctwIGgqzwurdWe3+eGNr+n/gU0HMb3SsmLCOtXYi P5pGUUlWchJ+kw8FJEOxrngpp3hCxZWtJEfcwILGZ9rQHpGO+UY3j9Sk0OYvP0RA5bLwV1 DMqcdkHxjx6mJU60Ezo4vTXt6SwTusNOZLDs0noVRnL+L85u9htQhs3G55rlK6Wte/uqYZ mpl5SCj43U5YOoBDsXZeL2vC4K4TVuWs66P24M0cj+MSbxNIxSW7RDFN8Lo1Ff1TzAiCKp Yf3wvWKZlcvJS1q+Ineg0UKX30TTGJY+sr9ZwrbseXxQCYX9+U9UQC3Vsuwodg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1645280554; a=rsa-sha256; cv=none; b=NFbh3bmw02AoT6K/pFnFkRUuDYtbZo02h4dx4iXJJqSlAm34v/3HK7io1SNuHEyRppnbvv Rp9HRuS0JZ7xOaBkJlwjArJ7Gm02URWXEH887RTd9BgEK1wvXrhCHZRmexgLanNlPyh8UO nxVTbsq/1ppq1GYK5xzxDyC8gxo1AsFOoVB+c5jlSW6XfYiemF0SvYvKZgsTyy4SkHiSRk oopE3u26niXLN/EH3k6usAE2OHpHaxN2qZJb9/CM2bG9/Lu14s9h7avMeiouxJ3Jask8IO FetHIRqvDYKrt7j4vOSBlsHic7Ph0hn+l0Q+Likv4Ps/jcasxqcByXw9CMbxQw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/12 has been updated by kp: URL: https://cgit.FreeBSD.org/src/commit/?id=ab2c8a52a3a983e48cdd3f31191e577fbf571535 commit ab2c8a52a3a983e48cdd3f31191e577fbf571535 Author: Kristof Provost AuthorDate: 2022-02-01 17:25:57 +0000 Commit: Kristof Provost CommitDate: 2022-02-19 08:43:33 +0000 pf: deal with tables gaining or losing counters When we create a table without counters, add an entry and later re-define the table to have counters we wound up trying to read non-existent counters. We now cope with this by attempting to add them if needed, removing them when they're no longer needed and not trying to read from counters that are not present. MFC after: 2 weeks Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D34131 (cherry picked from commit b21826bf15f7ec1e206fa3cfdf40691f84fb1d8e) --- sys/netpfil/pf/pf_table.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/sys/netpfil/pf/pf_table.c b/sys/netpfil/pf/pf_table.c index af7e36c91c08..0012d0f864c4 100644 --- a/sys/netpfil/pf/pf_table.c +++ b/sys/netpfil/pf/pf_table.c @@ -103,7 +103,8 @@ struct pfr_walktree { PFRW_GET_ADDRS, PFRW_GET_ASTATS, PFRW_POOL_GET, - PFRW_DYNADDR_UPDATE + PFRW_DYNADDR_UPDATE, + PFRW_COUNTERS } pfrw_op; union { struct pfr_addr *pfrw1_addr; @@ -1033,7 +1034,8 @@ pfr_copyout_astats(struct pfr_astats *as, const struct pfr_kentry *ke, pfr_copyout_addr(&as->pfras_a, ke); as->pfras_tzero = kc->pfrkc_tzero; - if (! (w->pfrw_flags & PFR_TFLAG_COUNTERS)) { + if (! (w->pfrw_flags & PFR_TFLAG_COUNTERS) || + kc->pfrkc_counters == NULL) { bzero(as->pfras_packets, sizeof(as->pfras_packets)); bzero(as->pfras_bytes, sizeof(as->pfras_bytes)); as->pfras_a.pfra_fback = PFR_FB_NOCOUNT; @@ -1115,6 +1117,21 @@ pfr_walktree(struct radix_node *rn, void *arg) } break; } + case PFRW_COUNTERS: + { + if (w->pfrw_flags & PFR_TFLAG_COUNTERS) { + if (ke->pfrke_counters.pfrkc_counters != NULL) + break; + ke->pfrke_counters.pfrkc_counters = + uma_zalloc_pcpu(V_pfr_kentry_counter_z, + M_NOWAIT | M_ZERO); + } else { + uma_zfree_pcpu(V_pfr_kentry_counter_z, + ke->pfrke_counters.pfrkc_counters); + ke->pfrke_counters.pfrkc_counters = NULL; + } + break; + } } return (0); } @@ -1819,6 +1836,7 @@ static void pfr_setflags_ktable(struct pfr_ktable *kt, int newf) { struct pfr_kentryworkq addrq; + struct pfr_walktree w; PF_RULES_WASSERT(); @@ -1839,6 +1857,20 @@ pfr_setflags_ktable(struct pfr_ktable *kt, int newf) V_pfr_ktable_cnt--; return; } + if (newf & PFR_TFLAG_COUNTERS && ! (kt->pfrkt_flags & PFR_TFLAG_COUNTERS)) { + bzero(&w, sizeof(w)); + w.pfrw_op = PFRW_COUNTERS; + w.pfrw_flags |= PFR_TFLAG_COUNTERS; + kt->pfrkt_ip4->rnh_walktree(&kt->pfrkt_ip4->rh, pfr_walktree, &w); + kt->pfrkt_ip6->rnh_walktree(&kt->pfrkt_ip6->rh, pfr_walktree, &w); + } + if (! (newf & PFR_TFLAG_COUNTERS) && (kt->pfrkt_flags & PFR_TFLAG_COUNTERS)) { + bzero(&w, sizeof(w)); + w.pfrw_op = PFRW_COUNTERS; + w.pfrw_flags |= 0; + kt->pfrkt_ip4->rnh_walktree(&kt->pfrkt_ip4->rh, pfr_walktree, &w); + kt->pfrkt_ip6->rnh_walktree(&kt->pfrkt_ip6->rh, pfr_walktree, &w); + } if (!(newf & PFR_TFLAG_ACTIVE) && kt->pfrkt_cnt) { pfr_enqueue_addrs(kt, &addrq, NULL, 0); pfr_remove_kentries(kt, &addrq);