summaryrefslogtreecommitdiff
path: root/src/cache-ct.c
diff options
context:
space:
mode:
authorAlexander Wirt <formorer@debian.org>2014-09-19 10:15:13 +0200
committerAlexander Wirt <formorer@debian.org>2014-09-19 10:15:13 +0200
commit9f760e5d3f6b44ecf5bb7144517e022fd987fa76 (patch)
treea19ccbfccc5049ee3a8252725191af221f31b3ea /src/cache-ct.c
parent6b61aefbf3de71852386f5f26d60c10ef62407d3 (diff)
downloadconntrack-tools-9f760e5d3f6b44ecf5bb7144517e022fd987fa76.tar.gz
conntrack-tools-9f760e5d3f6b44ecf5bb7144517e022fd987fa76.zip
Imported Upstream version 1.4.2
Diffstat (limited to 'src/cache-ct.c')
-rw-r--r--src/cache-ct.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/cache-ct.c b/src/cache-ct.c
index 0ad8d2a..f86d143 100644
--- a/src/cache-ct.c
+++ b/src/cache-ct.c
@@ -59,7 +59,7 @@ cache_hash6_ct(const struct nf_conntrack *ct, const struct hashtable *table)
uint32_t a[10];
memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4);
- memcpy(&a[4], 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);
a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 |
nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 |
@@ -88,14 +88,21 @@ cache_ct_hash(const void *data, const struct hashtable *table)
return ret;
}
+/* master conntrack of expectations have no ID */
+static inline int
+cache_ct_cmp_id(const struct nf_conntrack *ct1, const struct nf_conntrack *ct2)
+{
+ return nfct_attr_is_set(ct2, ATTR_ID) ?
+ nfct_get_attr_u32(ct1, ATTR_ID) == nfct_get_attr_u32(ct2, ATTR_ID) : 1;
+}
+
static int cache_ct_cmp(const void *data1, const void *data2)
{
const struct cache_object *obj = data1;
const struct nf_conntrack *ct = data2;
return nfct_cmp(obj->ptr, ct, NFCT_CMP_ORIG) &&
- nfct_get_attr_u32(obj->ptr, ATTR_ID) ==
- nfct_get_attr_u32(ct, ATTR_ID);
+ cache_ct_cmp_id(obj->ptr, ct);
}
static void *cache_ct_alloc(void)