git: b6c8c7b99a75 - main - pf: add pf_bcmp_state_key

From: Mateusz Guzik <mjg_at_FreeBSD.org>
Date: Sun, 28 Nov 2021 19:16:31 UTC
The branch main has been updated by mjg:

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

commit b6c8c7b99a750de18509715890615ad3f948b29a
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2021-11-24 17:25:18 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2021-11-28 19:15:45 +0000

    pf: add pf_bcmp_state_key
    
    Reviewed by:    kp
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision: https://reviews.freebsd.org/D33131
---
 sys/netpfil/pf/pf.c | 40 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 37 insertions(+), 3 deletions(-)

diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index d01ee906740f..1686def46260 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -419,6 +419,40 @@ VNET_DEFINE(struct intr_event *, pf_swi_ie);
 VNET_DEFINE(uint32_t, pf_hashseed);
 #define	V_pf_hashseed	VNET(pf_hashseed)
 
+#ifdef __LP64__
+static int
+pf_bcmp_state_key(struct pf_state_key *k1_orig, struct pf_state_key_cmp *k2_orig)
+{
+	unsigned long *k1 = (unsigned long *)k1_orig;
+	unsigned long *k2 = (unsigned long *)k2_orig;
+
+	if (k1[0] != k2[0])
+		return (1);
+
+	if (k1[1] != k2[1])
+		return (1);
+
+	if (k1[2] != k2[2])
+		return (1);
+
+	if (k1[3] != k2[3])
+		return (1);
+
+	if (k1[4] != k2[4])
+		return (1);
+
+	return (0);
+}
+_Static_assert(sizeof(struct pf_state_key_cmp) == 40, "bad size of pf_state_key_cmp");
+#else
+static inline int
+pf_bcmp_state_key(struct pf_state_key *k1_orig, struct pf_state_key_cmp *k2_orig)
+{
+
+	return (bcmp(k1_orig, k2_orig, sizeof(struct pf_state_key_cmp)));
+}
+#endif
+
 int
 pf_addr_cmp(struct pf_addr *a, struct pf_addr *b, sa_family_t af)
 {
@@ -1174,7 +1208,7 @@ pf_state_key_attach(struct pf_state_key *skw, struct pf_state_key *sks,
 
 keyattach:
 	LIST_FOREACH(cur, &kh->keys, entry)
-		if (bcmp(cur, sk, sizeof(struct pf_state_key_cmp)) == 0)
+		if (pf_bcmp_state_key(cur, (struct pf_state_key_cmp *)sk) == 0)
 			break;
 
 	if (cur != NULL) {
@@ -1480,7 +1514,7 @@ pf_find_state(struct pfi_kkif *kif, struct pf_state_key_cmp *key, u_int dir)
 
 	PF_HASHROW_LOCK(kh);
 	LIST_FOREACH(sk, &kh->keys, entry)
-		if (bcmp(sk, key, sizeof(struct pf_state_key_cmp)) == 0)
+		if (pf_bcmp_state_key(sk, key) == 0)
 			break;
 	if (sk == NULL) {
 		PF_HASHROW_UNLOCK(kh);
@@ -1527,7 +1561,7 @@ pf_find_state_all(struct pf_state_key_cmp *key, u_int dir, int *more)
 
 	PF_HASHROW_LOCK(kh);
 	LIST_FOREACH(sk, &kh->keys, entry)
-		if (bcmp(sk, key, sizeof(struct pf_state_key_cmp)) == 0)
+		if (pf_bcmp_state_key(sk, key) == 0)
 			break;
 	if (sk == NULL) {
 		PF_HASHROW_UNLOCK(kh);