diff options
author | Adam Casella <ihateprod@gmail.com> | 2021-08-17 13:31:25 -0700 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2021-09-20 10:21:53 +0200 |
commit | 05bc2c3bc09a03bb903eed0c069d539f600e5217 (patch) | |
tree | 29c6aa7351c7a9d076c298be2f70a67c45d1e025 | |
parent | 420470004059c81f7ba83d655e6d27c921c652d2 (diff) |
conntrackd: cache: fix zone entry uniqueness in external cache
In some use-cases, zone is used to differetiate conntrack state. This preserves that uniqueness by adding zone into the cache in addtion to 5-tuple data
This preserves external-cache uniqueness per zone when synced.
Fixes: a08af5d26297 ("conntrack: fix zone sync issue")
Signed-off-by: Adam Casella <adam.casella1984@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | src/cache-ct.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/cache-ct.c b/src/cache-ct.c index abcfde4..fe01e16 100644 --- a/src/cache-ct.c +++ b/src/cache-ct.c @@ -34,13 +34,14 @@ static uint32_t cache_hash4_ct(const struct nf_conntrack *ct, const struct hashtable *table) { - uint32_t a[4] = { + uint32_t a[5] = { [0] = nfct_get_attr_u32(ct, ATTR_IPV4_SRC), [1] = nfct_get_attr_u32(ct, ATTR_IPV4_DST), [2] = nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | nfct_get_attr_u8(ct, ATTR_L4PROTO), [3] = nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | nfct_get_attr_u16(ct, ATTR_PORT_DST), + [4] = nfct_get_attr_u16(ct, ATTR_ZONE), }; /* @@ -50,13 +51,13 @@ cache_hash4_ct(const struct nf_conntrack *ct, const struct hashtable *table) * but using a multiply, less expensive than a divide. See: * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html */ - return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; + return ((uint64_t)jhash2(a, 5, 0) * table->hashsize) >> 32; } static uint32_t cache_hash6_ct(const struct nf_conntrack *ct, const struct hashtable *table) { - uint32_t a[10]; + uint32_t a[11]; memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_DST), sizeof(uint32_t)*4); @@ -64,8 +65,9 @@ cache_hash6_ct(const struct nf_conntrack *ct, const struct hashtable *table) nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); + a[10] = nfct_get_attr_u16(ct, ATTR_ZONE); - return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; + return ((uint64_t)jhash2(a, 11, 0) * table->hashsize) >> 32; } static uint32_t |