From nobody Thu Sep 7 17:05:33 2023 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 4RhQby3PVdz4s24b; Thu, 7 Sep 2023 17:05: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 4RhQby21tbz4DlB; Thu, 7 Sep 2023 17:05:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1694106334; 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=nUhfJfvA2VS2EtKEsXVGRdnMmnNnItaCppdFQttGcBQ=; b=Zj1Dc8EVQou1ajbc1k+SjOmuZRwtjORynZLIp31XKOR5hkgswOJXbysQ5+X6RjvkgiVlRb NMW+QfqWbrPtFor6RttvFSLdrMY3l38s7L6eu53Ao/s9HThj2prcrTVEdg2uOJkOW0Y4fy +PUyXHwAvx4jwyz0/AQ22km92gihghbJv1U3DeV37ayQbVBpnwEh0NexmF2udajtocFpeR nfAWq8ptYZl/4t7WWH9Q3nNMmD1lStnu2zffq5vXSSPhWVopwvkC0+t8UV9LRzwIPT2ZEY JDhLJ1cHswFoXZ+pnslkfcISV1UMXzeySSvvoyxn7PsSy1ZHzGNdGQoVq7bUJg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1694106334; a=rsa-sha256; cv=none; b=adE3kd17tdMdfcPmYmCtatV04ncjl2YP4xh5rGzmBeDYrcziFojAUE6QSI79eeUe34z4ss /meZp+B3TDqx0MMPdbr6Ez3zJmGhM4gMru+rD4QZwKlPGTmTGNXgb5gLo6MKyUIArNbB0L vltAAkxs0uqd4ZlKXvpKTVQ13MwnVNkKjE61/6xFgTsbeFI8TmIZdz63Djn7DH2h3C/h9V FODEbsb2R/tXW5/GcXzzP2H0JtcE/uOrKfMOVddiV6uDBTJRmcWLR7JOsWR3rbzoMF7Bx8 Qxa+p1XrTpLK2UCNB/9lGkkcS51egsqXrEagBOcvUaOaaRrUavAbMx+j6IxOGg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1694106334; 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=nUhfJfvA2VS2EtKEsXVGRdnMmnNnItaCppdFQttGcBQ=; b=MIbLn+hTTTBtkZX07o15yekA86GjSuxLwqBeJa6CXQ6MrDB7BTsD7Dy9gBoefyQ3pL0HDb 7L9ij1+JJdzghJGfl3/Y1UL0xQ3e2vnyThZHqjgi+3c9Ic3uMRWnkMidul86FI8xAtq7GA irJ9kVID7hEoId4qMekgGbmClbl7mIZf3yC2D7dVt/sDy/XOLZnZwwyo7RaylleANZCBEl uOaQujP/to+8dCKFdBDsw7CWhCBHSNPq06CmpcGBiojeG6PfLwEa149mh9GwGXVVWPtX1u 8L5Y0GuS6HsnBsvSrAYAX8CrP68eCC7FkIWOfP/nWLyhe68790cFwbZ8wOVrFA== 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 4RhQby0kQMz16f8; Thu, 7 Sep 2023 17:05:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 387H5YWT032585; Thu, 7 Sep 2023 17:05:34 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 387H5XIh032582; Thu, 7 Sep 2023 17:05:33 GMT (envelope-from git) Date: Thu, 7 Sep 2023 17:05:33 GMT Message-Id: <202309071705.387H5XIh032582@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: 4d3af82f7896 - main - pf: mark removed connections within a multihome association as shutting down 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: 4d3af82f78961180149e8a579b481dc382f76eef Auto-Submitted: auto-generated The branch main has been updated by kp: URL: https://cgit.FreeBSD.org/src/commit/?id=4d3af82f78961180149e8a579b481dc382f76eef commit 4d3af82f78961180149e8a579b481dc382f76eef Author: Kristof Provost AuthorDate: 2023-09-05 16:30:42 +0000 Commit: Kristof Provost CommitDate: 2023-09-07 17:05:01 +0000 pf: mark removed connections within a multihome association as shutting down Parse IP removal in ASCONF chunks, find the affected state(s) and mark them as shutting down. This will cause them to time out according to PFTM_TCP_CLOSING timeouts, rather than waiting for the established session timeout. MFC after: 3 weeks Sponsored by: Orange Business Services --- sys/net/pfvar.h | 1 + sys/netpfil/pf/pf.c | 87 ++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h index d63a7bb1afb2..a5eeb60a0d7c 100644 --- a/sys/net/pfvar.h +++ b/sys/net/pfvar.h @@ -1599,6 +1599,7 @@ struct pf_sctp_multihome_job { struct pf_addr src; struct pf_addr dst; struct mbuf *m; + int op; }; #endif diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c index 5667cb422bbb..9a571b1ee3d9 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -5941,17 +5941,57 @@ pf_sctp_multihome_delayed(struct pf_pdesc *pd, int off, struct pfi_kkif *kif, PF_RULES_RLOCK_TRACKER; TAILQ_FOREACH_SAFE(j, &pd->sctp_multihome_jobs, next, tmp) { - PF_RULES_RLOCK(); - j->pd.sctp_flags |= PFDESC_SCTP_ADD_IP; - action = pf_test_rule(&r, &sm, kif, - j->m, off, &j->pd, &ra, &rs, NULL); - PF_RULES_RUNLOCK(); - SDT_PROBE4(pf, sctp, multihome, test, kif, r, j->m, action); - if (sm) { - /* Inherit v_tag values. */ - sm->src.scrub->pfss_v_tag = s->src.scrub->pfss_flags; - sm->dst.scrub->pfss_v_tag = s->dst.scrub->pfss_flags; - PF_STATE_UNLOCK(sm); + switch (j->op) { + case SCTP_ADD_IP_ADDRESS: { + j->pd.sctp_flags |= PFDESC_SCTP_ADD_IP; + PF_RULES_RLOCK(); + action = pf_test_rule(&r, &sm, kif, + j->m, off, &j->pd, &ra, &rs, NULL); + PF_RULES_RUNLOCK(); + SDT_PROBE4(pf, sctp, multihome, test, kif, r, j->m, action); + if (sm) { + /* Inherit v_tag values. */ + sm->src.scrub->pfss_v_tag = s->src.scrub->pfss_flags; + sm->dst.scrub->pfss_v_tag = s->dst.scrub->pfss_flags; + PF_STATE_UNLOCK(sm); + } + break; + } + case SCTP_DEL_IP_ADDRESS: { + struct pf_state_key_cmp key; + uint8_t psrc; + + bzero(&key, sizeof(key)); + key.af = j->pd.af; + key.proto = IPPROTO_SCTP; + if (j->pd.dir == PF_IN) { /* wire side, straight */ + PF_ACPY(&key.addr[0], j->pd.src, key.af); + PF_ACPY(&key.addr[1], j->pd.dst, key.af); + key.port[0] = j->pd.hdr.sctp.src_port; + key.port[1] = j->pd.hdr.sctp.dest_port; + } else { /* stack side, reverse */ + PF_ACPY(&key.addr[1], j->pd.src, key.af); + PF_ACPY(&key.addr[0], j->pd.dst, key.af); + key.port[1] = j->pd.hdr.sctp.src_port; + key.port[0] = j->pd.hdr.sctp.dest_port; + } + + sm = pf_find_state(kif, &key, j->pd.dir); + if (sm != NULL) { + PF_STATE_LOCK_ASSERT(sm); + if (j->pd.dir == sm->direction) { + psrc = PF_PEER_SRC; + } else { + psrc = PF_PEER_DST; + } + pf_set_protostate(sm, psrc, SCTP_SHUTDOWN_PENDING); + sm->timeout = PFTM_TCP_CLOSING; + PF_STATE_UNLOCK(sm); + } + break; + default: + panic("Unknown op %#x", j->op); + } } free(j, M_PFTEMP); @@ -5960,7 +6000,7 @@ pf_sctp_multihome_delayed(struct pf_pdesc *pd, int off, struct pfi_kkif *kif, static int pf_multihome_scan(struct mbuf *m, int start, int len, struct pf_pdesc *pd, - struct pfi_kkif *kif) + struct pfi_kkif *kif, int op) { int off = 0; struct pf_sctp_multihome_job *job; @@ -6022,6 +6062,7 @@ pf_multihome_scan(struct mbuf *m, int start, int len, struct pf_pdesc *pd, memcpy(&job->dst, pd->dst, sizeof(job->dst)); job->pd.dst = &job->dst; job->m = m; + job->op = op; TAILQ_INSERT_TAIL(&pd->sctp_multihome_jobs, job, next); break; @@ -6052,6 +6093,7 @@ pf_multihome_scan(struct mbuf *m, int start, int len, struct pf_pdesc *pd, memcpy(&job->dst, pd->dst, sizeof(job->dst)); job->pd.dst = &job->dst; job->m = m; + job->op = op; TAILQ_INSERT_TAIL(&pd->sctp_multihome_jobs, job, next); break; @@ -6066,7 +6108,22 @@ pf_multihome_scan(struct mbuf *m, int start, int len, struct pf_pdesc *pd, return (PF_DROP); ret = pf_multihome_scan(m, start + off + sizeof(ah), - ntohs(ah.ph.param_length) - sizeof(ah), pd, kif); + ntohs(ah.ph.param_length) - sizeof(ah), pd, kif, + SCTP_ADD_IP_ADDRESS); + if (ret != PF_PASS) + return (ret); + break; + } + case SCTP_DEL_IP_ADDRESS: { + int ret; + struct sctp_asconf_paramhdr ah; + + if (!pf_pull_hdr(m, start + off, &ah, sizeof(ah), + NULL, NULL, pd->af)) + return (PF_DROP); + ret = pf_multihome_scan(m, start + off + sizeof(ah), + ntohs(ah.ph.param_length) - sizeof(ah), pd, kif, + SCTP_DEL_IP_ADDRESS); if (ret != PF_PASS) return (ret); break; @@ -6087,7 +6144,7 @@ pf_multihome_scan_init(struct mbuf *m, int start, int len, struct pf_pdesc *pd, start += sizeof(struct sctp_init_chunk); len -= sizeof(struct sctp_init_chunk); - return (pf_multihome_scan(m, start, len, pd, kif)); + return (pf_multihome_scan(m, start, len, pd, kif, SCTP_ADD_IP_ADDRESS)); } int @@ -6097,7 +6154,7 @@ pf_multihome_scan_asconf(struct mbuf *m, int start, int len, start += sizeof(struct sctp_asconf_chunk); len -= sizeof(struct sctp_asconf_chunk); - return (pf_multihome_scan(m, start, len, pd, kif)); + return (pf_multihome_scan(m, start, len, pd, kif, SCTP_ADD_IP_ADDRESS)); } static int