From fe726f27679e55b46bd7c601a81f71b81cf6d742 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Sun, 2 Jun 2013 21:16:05 +0200 Subject: conntrack: nfct_cmp: also compare labels Signed-off-by: Florian Westphal --- src/conntrack/compare.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/conntrack/compare.c') diff --git a/src/conntrack/compare.c b/src/conntrack/compare.c index 97c25cb..f4a194a 100644 --- a/src/conntrack/compare.c +++ b/src/conntrack/compare.c @@ -370,6 +370,51 @@ cmp_secctx(const struct nf_conntrack *ct1, return strcmp(ct1->secctx, ct2->secctx) == 0; } +static int __cmp_clabel(const struct nfct_bitmask *a, + const struct nfct_bitmask *b) +{ + unsigned int len, max; + const uint32_t *bits; + + if (a == NULL || b == NULL) + return a == b; + + if (a->words < b->words) { + bits = b->bits; + max = b->words; + len = a->words; + } else { + bits = a->bits; + max = a->words; + len = b->words; + } + + while (max > len) { + if (bits[--max]) + return 0; + } + /* bitmask sizes are equal or extra bits are not set */ + return memcmp(a->bits, b->bits, len * sizeof(a->bits[0])) == 0; +} + +static int cmp_clabel(const struct nf_conntrack *ct1, + const struct nf_conntrack *ct2, + unsigned int flags) +{ + return __cmp_clabel(nfct_get_attr(ct1, ATTR_CONNLABELS), + nfct_get_attr(ct2, ATTR_CONNLABELS)); + +} + +static int cmp_clabel_mask(const struct nf_conntrack *ct1, + const struct nf_conntrack *ct2, + unsigned int flags) +{ + return __cmp_clabel(nfct_get_attr(ct1, ATTR_CONNLABELS_MASK), + nfct_get_attr(ct2, ATTR_CONNLABELS_MASK)); + +} + static int cmp_meta(const struct nf_conntrack *ct1, const struct nf_conntrack *ct2, unsigned int flags) @@ -392,6 +437,10 @@ static int cmp_meta(const struct nf_conntrack *ct1, return 0; if (!__cmp(ATTR_SECCTX, ct1, ct2, flags, cmp_secctx)) return 0; + if (!__cmp(ATTR_CONNLABELS, ct1, ct2, flags, cmp_clabel)) + return 0; + if (!__cmp(ATTR_CONNLABELS_MASK, ct1, ct2, flags, cmp_clabel_mask)) + return 0; return 1; } -- cgit v1.2.3