git: 170821d5241f - stable/12 - pf: add pf_bcmp_state_key
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 02 Aug 2022 20:05:11 UTC
The branch stable/12 has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=170821d5241fc7b944508b09ff90d4f7b06d67cb commit 170821d5241fc7b944508b09ff90d4f7b06d67cb Author: Mateusz Guzik <mjg@FreeBSD.org> AuthorDate: 2021-11-24 17:25:18 +0000 Commit: Mateusz Guzik <mjg@FreeBSD.org> CommitDate: 2022-08-02 20:04:55 +0000 pf: add pf_bcmp_state_key Reviewed by: kp Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D33131 (cherry picked from commit b6c8c7b99a750de18509715890615ad3f948b29a) --- 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 518b082621cb..0a6928e3d4eb 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -413,6 +413,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) { @@ -1168,7 +1202,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) { @@ -1474,7 +1508,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); @@ -1518,7 +1552,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);