pf: add pf_bcmp_state_key

Reviewed by:	kp
Sponsored by:	Rubicon Communications, LLC ("Netgate")
Differential Revision: https://reviews.freebsd.org/D33131
This commit is contained in:
Mateusz Guzik 2021-11-24 18:25:18 +01:00
parent 0179739a00
commit b6c8c7b99a

View File

@ -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);