|
@@ -252,7 +252,7 @@ static inline int expect_clash(const struct nf_conntrack_expect *a,
|
|
|
static inline int expect_matches(const struct nf_conntrack_expect *a,
|
|
|
const struct nf_conntrack_expect *b)
|
|
|
{
|
|
|
- return a->master == b->master && a->class == b->class &&
|
|
|
+ return a->master == b->master &&
|
|
|
nf_ct_tuple_equal(&a->tuple, &b->tuple) &&
|
|
|
nf_ct_tuple_mask_equal(&a->mask, &b->mask) &&
|
|
|
net_eq(nf_ct_net(a->master), nf_ct_net(b->master)) &&
|
|
@@ -421,6 +421,9 @@ static inline int __nf_ct_expect_check(struct nf_conntrack_expect *expect)
|
|
|
h = nf_ct_expect_dst_hash(net, &expect->tuple);
|
|
|
hlist_for_each_entry_safe(i, next, &nf_ct_expect_hash[h], hnode) {
|
|
|
if (expect_matches(i, expect)) {
|
|
|
+ if (i->class != expect->class)
|
|
|
+ return -EALREADY;
|
|
|
+
|
|
|
if (nf_ct_remove_expect(i))
|
|
|
break;
|
|
|
} else if (expect_clash(i, expect)) {
|