git: 911d74bcbd7a - main - pf: simplify pf_patch* arguments

From: Kristof Provost <kp_at_FreeBSD.org>
Date: Wed, 16 Apr 2025 18:02:58 UTC
The branch main has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=911d74bcbd7aa4202f1ee7251ac6b01af7fbfe4c

commit 911d74bcbd7aa4202f1ee7251ac6b01af7fbfe4c
Author:     Kristof Provost <kp@FreeBSD.org>
AuthorDate: 2025-04-16 10:17:45 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2025-04-16 14:23:49 +0000

    pf: simplify pf_patch* arguments
    
    Pass struct pf_pdesc rather than separate arguments.
    
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
---
 sys/net/pfvar.h          |  6 ++----
 sys/netpfil/pf/pf.c      | 42 +++++++++++++++++++-----------------------
 sys/netpfil/pf/pf_norm.c | 18 ++++++------------
 3 files changed, 27 insertions(+), 39 deletions(-)

diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h
index a38525353a9c..b216b888832f 100644
--- a/sys/net/pfvar.h
+++ b/sys/net/pfvar.h
@@ -2453,10 +2453,8 @@ void	pf_change_a(void *, u_int16_t *, u_int32_t, u_int8_t);
 void	pf_change_proto_a(struct mbuf *, void *, u_int16_t *, u_int32_t,
 	    u_int8_t);
 void	pf_change_tcp_a(struct mbuf *, void *, u_int16_t *, u_int32_t);
-void	pf_patch_16_unaligned(struct mbuf *, u_int16_t *, void *, u_int16_t,
-	    bool, u_int8_t);
-void	pf_patch_32_unaligned(struct mbuf *, u_int16_t *, void *, u_int32_t,
-    bool, u_int8_t);
+void	pf_patch_16_unaligned(struct pf_pdesc *, void *, u_int16_t, bool);
+void	pf_patch_32_unaligned(struct pf_pdesc *, void *, u_int32_t, bool);
 void	pf_send_deferred_syn(struct pf_kstate *);
 int	pf_match_addr(u_int8_t, const struct pf_addr *,
 	    const struct pf_addr *, const struct pf_addr *, sa_family_t);
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 97d332bd348c..24963d010e04 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -381,8 +381,8 @@ static int		 pf_walk_header6(struct pf_pdesc *, struct ip6_hdr *,
 			    u_short *);
 static void		 pf_print_state_parts(struct pf_kstate *,
 			    struct pf_state_key *, struct pf_state_key *);
-static void		 pf_patch_8(struct mbuf *, u_int16_t *, u_int8_t *, u_int8_t,
-			    bool, u_int8_t);
+static void		 pf_patch_8(struct pf_pdesc *, u_int8_t *, u_int8_t,
+			    bool);
 static struct pf_kstate	*pf_find_state(struct pfi_kkif *,
 			    const struct pf_state_key_cmp *, u_int);
 static bool		 pf_src_connlimit(struct pf_kstate *);
@@ -3216,8 +3216,7 @@ pf_cksum_fixup(u_int16_t cksum, u_int16_t old, u_int16_t new, u_int8_t udp)
 }
 
 static void
-pf_patch_8(struct mbuf *m, u_int16_t *cksum, u_int8_t *f, u_int8_t v, bool hi,
-    u_int8_t udp)
+pf_patch_8(struct pf_pdesc *pd, u_int8_t *f, u_int8_t v, bool hi)
 {
 	u_int16_t old = htons(hi ? (*f << 8) : *f);
 	u_int16_t new = htons(hi ? ( v << 8) :  v);
@@ -3227,34 +3226,33 @@ pf_patch_8(struct mbuf *m, u_int16_t *cksum, u_int8_t *f, u_int8_t v, bool hi,
 
 	*f = v;
 
-	if (m->m_pkthdr.csum_flags & (CSUM_DELAY_DATA | CSUM_DELAY_DATA_IPV6))
+	if (pd->m->m_pkthdr.csum_flags & (CSUM_DELAY_DATA | CSUM_DELAY_DATA_IPV6))
 		return;
 
-	*cksum = pf_cksum_fixup(*cksum, old, new, udp);
+	*pd->pcksum = pf_cksum_fixup(*pd->pcksum, old, new,
+	    pd->proto == IPPROTO_UDP);
 }
 
 void
-pf_patch_16_unaligned(struct mbuf *m, u_int16_t *cksum, void *f, u_int16_t v,
-    bool hi, u_int8_t udp)
+pf_patch_16_unaligned(struct pf_pdesc *pd, void *f, u_int16_t v, bool hi)
 {
 	u_int8_t *fb = (u_int8_t *)f;
 	u_int8_t *vb = (u_int8_t *)&v;
 
-	pf_patch_8(m, cksum, fb++, *vb++, hi, udp);
-	pf_patch_8(m, cksum, fb++, *vb++, !hi, udp);
+	pf_patch_8(pd, fb++, *vb++, hi);
+	pf_patch_8(pd, fb++, *vb++, !hi);
 }
 
 void
-pf_patch_32_unaligned(struct mbuf *m, u_int16_t *cksum, void *f, u_int32_t v,
-    bool hi, u_int8_t udp)
+pf_patch_32_unaligned(struct pf_pdesc *pd, void *f, u_int32_t v, bool hi)
 {
 	u_int8_t *fb = (u_int8_t *)f;
 	u_int8_t *vb = (u_int8_t *)&v;
 
-	pf_patch_8(m, cksum, fb++, *vb++, hi, udp);
-	pf_patch_8(m, cksum, fb++, *vb++, !hi, udp);
-	pf_patch_8(m, cksum, fb++, *vb++, hi, udp);
-	pf_patch_8(m, cksum, fb++, *vb++, !hi, udp);
+	pf_patch_8(pd, fb++, *vb++, hi);
+	pf_patch_8(pd, fb++, *vb++, !hi);
+	pf_patch_8(pd, fb++, *vb++, hi);
+	pf_patch_8(pd, fb++, *vb++, !hi);
 }
 
 u_int16_t
@@ -3952,16 +3950,14 @@ pf_modulate_sack(struct pf_pdesc *pd, struct tcphdr *th,
 				for (i = 2; i + TCPOLEN_SACK <= olen;
 				    i += TCPOLEN_SACK) {
 					memcpy(&sack, &opt[i], sizeof(sack));
-					pf_patch_32_unaligned(pd->m,
-					    &th->th_sum, &sack.start,
+					pf_patch_32_unaligned(pd,
+					    &sack.start,
 					    htonl(ntohl(sack.start) - dst->seqdiff),
-					    PF_ALGNMNT(startoff),
-					    0);
-					pf_patch_32_unaligned(pd->m, &th->th_sum,
+					    PF_ALGNMNT(startoff));
+					pf_patch_32_unaligned(pd,
 					    &sack.end,
 					    htonl(ntohl(sack.end) - dst->seqdiff),
-					    PF_ALGNMNT(startoff),
-					    0);
+					    PF_ALGNMNT(startoff));
 					memcpy(&opt[i], &sack, sizeof(sack));
 				}
 				copyback = 1;
diff --git a/sys/netpfil/pf/pf_norm.c b/sys/netpfil/pf/pf_norm.c
index 1bf672f39204..10e740d33b0d 100644
--- a/sys/netpfil/pf/pf_norm.c
+++ b/sys/netpfil/pf/pf_norm.c
@@ -1633,13 +1633,11 @@ pf_normalize_tcp_stateful(struct pf_pdesc *pd,
 					    (src->scrub->pfss_flags &
 					    PFSS_TIMESTAMP)) {
 						tsval = ntohl(tsval);
-						pf_patch_32_unaligned(pd->m,
-						    &th->th_sum,
+						pf_patch_32_unaligned(pd,
 						    &opt[2],
 						    htonl(tsval +
 						    src->scrub->pfss_ts_mod),
-						    PF_ALGNMNT(startoff),
-						    0);
+						    PF_ALGNMNT(startoff));
 						copyback = 1;
 					}
 
@@ -1651,12 +1649,10 @@ pf_normalize_tcp_stateful(struct pf_pdesc *pd,
 					    PFSS_TIMESTAMP)) {
 						tsecr = ntohl(tsecr)
 						    - dst->scrub->pfss_ts_mod;
-						pf_patch_32_unaligned(pd->m,
-						    &th->th_sum,
+						pf_patch_32_unaligned(pd,
 						    &opt[6],
 						    htonl(tsecr),
-						    PF_ALGNMNT(startoff),
-						    0);
+						    PF_ALGNMNT(startoff));
 						copyback = 1;
 					}
 					got_ts = 1;
@@ -1978,11 +1974,9 @@ pf_normalize_mss(struct pf_pdesc *pd)
 		case TCPOPT_MAXSEG:
 			mss = (u_int16_t *)(optp + 2);
 			if ((ntohs(*mss)) > pd->act.max_mss) {
-				pf_patch_16_unaligned(pd->m,
-				    &th->th_sum,
+				pf_patch_16_unaligned(pd,
 				    mss, htons(pd->act.max_mss),
-				    PF_ALGNMNT(startoff),
-				    0);
+				    PF_ALGNMNT(startoff));
 				m_copyback(pd->m, pd->off + sizeof(*th),
 				    thoff - sizeof(*th), opts);
 				m_copyback(pd->m, pd->off, sizeof(*th), (caddr_t)th);