From nobody Sat Feb 05 10:07:20 2022 X-Original-To: dev-commits-src-main@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 3F549198C69A; Sat, 5 Feb 2022 10:07:21 +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 4JrSkc4MSZz4j0N; Sat, 5 Feb 2022 10:07:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1644055640; 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=hK7cc+TO/2t3Hb/ZcTzWJjnsoWhcNWndSg7/tXPqTeU=; b=DWNlsEc1gh0Ez384+4cVTp5sMcHX/QgOufdgaN4rrAuUJMSO7FOq6Ri3YHECgTtkIu3sOm +XnCiREoNVaf9r0uy7r5H11v71lREl3R0uFGvC/yUJfjfiA2aNYL+vblqsRGv0YtuL7smH iNKffmGxH2n7oD7k0iDYUL7TZnUOLoopgo7wQnKfaAIN/ND+gM380kQ+MFOr82YVESqUw4 u0az7VJQyDkb26zBxNJKmCjHWwj6u8SrJNT19uRtFC6i+aD74B4q1AegKsdSr1QKBTvgWf 5zrVuBCNjPZr7Dzk92ZNNth4wWQrtvEcd1/p4ppZv+JSzw8ZKMDZ/+jktFzgWQ== 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 39D3E1D364; Sat, 5 Feb 2022 10:07:20 +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 215A7K3u032873; Sat, 5 Feb 2022 10:07:20 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 215A7KlN032872; Sat, 5 Feb 2022 10:07:20 GMT (envelope-from git) Date: Sat, 5 Feb 2022 10:07:20 GMT Message-Id: <202202051007.215A7KlN032872@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kristof Provost Subject: git: b21826bf15f7 - main - pf: deal with tables gaining or losing counters List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: b21826bf15f7ec1e206fa3cfdf40691f84fb1d8e Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1644055640; 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=hK7cc+TO/2t3Hb/ZcTzWJjnsoWhcNWndSg7/tXPqTeU=; b=GLbh+zX5PMXjMARDXF72KbubC0enKWO1Y9kGO+t0NZMhkSS9u3ZDhh7tLQSRHFMquqWLF8 2C/wCgpj90/XASZAXGSPb1wPlSxi0k09SRhqnudhxoiKfhC1KcyqLwAG1z/7xoTw3lXVY9 Kpn1HnjLQiFvbQ81SLIySoGualhGxdeuf8H21mBkIUHLNHW+uBGfT5b/c6zBHfvprxc4Oa VwuckPgPfYNSBm3n6k7cyOV0eD+Q6cgIveOVx6vfYvcBVMd2HoAVqlA35LgOfbtLFXnNAm yntPgXy+mLsYA+XvO7BKpcU+DjlFXT3qPK4BvsNqGNaed/pQJIq9UnZ4K4XgrA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1644055640; a=rsa-sha256; cv=none; b=oHPXkmtdDIGD4FfGKnZYb1qa6T92AIoAJz9KT6J+NBbp5+akqGr+Bk0MPYXkC5ytEQdQMP 9NoJ4Tet0GIcYMLI9xLDnLkG004Or4hR7lXslf5LU1TTDGtkZxwlnoTNuuCOgHYuPMF6CT sMr7qwIoKtNpkwSqpUv4UU1wp/u7uryAd9CQ2VALOMyKSWRhDJpMwpcUGNekaC7mtEmd5k PU7S/ps5j13M2h/U+TghTR8ACholQU+7z8ffSWTMUAOS/pdVE4MrOCv2kezqVi0xablaUI XQ7InnszGkjlSGdQuBVX+6TqS0oXqSQ93YtN3hN6KicLH/8Oy5AwGk8IdG9Q8g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kp: URL: https://cgit.FreeBSD.org/src/commit/?id=b21826bf15f7ec1e206fa3cfdf40691f84fb1d8e commit b21826bf15f7ec1e206fa3cfdf40691f84fb1d8e Author: Kristof Provost AuthorDate: 2022-02-01 17:25:57 +0000 Commit: Kristof Provost CommitDate: 2022-02-05 09:29:34 +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 --- 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 4cfe5d61e83e..2352e43cb342 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; @@ -1032,7 +1033,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; @@ -1114,6 +1116,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); } @@ -1818,6 +1835,7 @@ static void pfr_setflags_ktable(struct pfr_ktable *kt, int newf) { struct pfr_kentryworkq addrq; + struct pfr_walktree w; PF_RULES_WASSERT(); @@ -1838,6 +1856,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);