|
|
@@ -29,6 +29,7 @@
|
|
|
#include <linux/spinlock.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/slab.h>
|
|
|
+#include <linux/siphash.h>
|
|
|
|
|
|
#include <linux/netfilter.h>
|
|
|
#include <net/netlink.h>
|
|
|
@@ -487,7 +488,9 @@ nla_put_failure:
|
|
|
|
|
|
static int ctnetlink_dump_id(struct sk_buff *skb, const struct nf_conn *ct)
|
|
|
{
|
|
|
- if (nla_put_be32(skb, CTA_ID, htonl((unsigned long)ct)))
|
|
|
+ __be32 id = (__force __be32)nf_ct_get_id(ct);
|
|
|
+
|
|
|
+ if (nla_put_be32(skb, CTA_ID, id))
|
|
|
goto nla_put_failure;
|
|
|
return 0;
|
|
|
|
|
|
@@ -1275,8 +1278,9 @@ static int ctnetlink_del_conntrack(struct net *net, struct sock *ctnl,
|
|
|
}
|
|
|
|
|
|
if (cda[CTA_ID]) {
|
|
|
- u_int32_t id = ntohl(nla_get_be32(cda[CTA_ID]));
|
|
|
- if (id != (u32)(unsigned long)ct) {
|
|
|
+ __be32 id = nla_get_be32(cda[CTA_ID]);
|
|
|
+
|
|
|
+ if (id != (__force __be32)nf_ct_get_id(ct)) {
|
|
|
nf_ct_put(ct);
|
|
|
return -ENOENT;
|
|
|
}
|
|
|
@@ -2675,6 +2679,25 @@ nla_put_failure:
|
|
|
|
|
|
static const union nf_inet_addr any_addr;
|
|
|
|
|
|
+static __be32 nf_expect_get_id(const struct nf_conntrack_expect *exp)
|
|
|
+{
|
|
|
+ static __read_mostly siphash_key_t exp_id_seed;
|
|
|
+ unsigned long a, b, c, d;
|
|
|
+
|
|
|
+ net_get_random_once(&exp_id_seed, sizeof(exp_id_seed));
|
|
|
+
|
|
|
+ a = (unsigned long)exp;
|
|
|
+ b = (unsigned long)exp->helper;
|
|
|
+ c = (unsigned long)exp->master;
|
|
|
+ d = (unsigned long)siphash(&exp->tuple, sizeof(exp->tuple), &exp_id_seed);
|
|
|
+
|
|
|
+#ifdef CONFIG_64BIT
|
|
|
+ return (__force __be32)siphash_4u64((u64)a, (u64)b, (u64)c, (u64)d, &exp_id_seed);
|
|
|
+#else
|
|
|
+ return (__force __be32)siphash_4u32((u32)a, (u32)b, (u32)c, (u32)d, &exp_id_seed);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
ctnetlink_exp_dump_expect(struct sk_buff *skb,
|
|
|
const struct nf_conntrack_expect *exp)
|
|
|
@@ -2722,7 +2745,7 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb,
|
|
|
}
|
|
|
#endif
|
|
|
if (nla_put_be32(skb, CTA_EXPECT_TIMEOUT, htonl(timeout)) ||
|
|
|
- nla_put_be32(skb, CTA_EXPECT_ID, htonl((unsigned long)exp)) ||
|
|
|
+ nla_put_be32(skb, CTA_EXPECT_ID, nf_expect_get_id(exp)) ||
|
|
|
nla_put_be32(skb, CTA_EXPECT_FLAGS, htonl(exp->flags)) ||
|
|
|
nla_put_be32(skb, CTA_EXPECT_CLASS, htonl(exp->class)))
|
|
|
goto nla_put_failure;
|
|
|
@@ -3027,7 +3050,8 @@ static int ctnetlink_get_expect(struct net *net, struct sock *ctnl,
|
|
|
|
|
|
if (cda[CTA_EXPECT_ID]) {
|
|
|
__be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
|
|
|
- if (ntohl(id) != (u32)(unsigned long)exp) {
|
|
|
+
|
|
|
+ if (id != nf_expect_get_id(exp)) {
|
|
|
nf_ct_expect_put(exp);
|
|
|
return -ENOENT;
|
|
|
}
|