Skip to content

Commit

Permalink
netfilter: xtables: obtain random bytes earlier, in checkentry
Browse files Browse the repository at this point in the history
We can initialize the random hash bytes on checkentry. This is
preferable since it is outside the hot path.

Reference: http://bugzilla.netfilter.org/show_bug.cgi?id=621
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Signed-off-by: Patrick McHardy <kaber@trash.net>
  • Loading branch information
Jan Engelhardt authored and kaber committed Jan 4, 2010
1 parent 5191d50 commit 294188a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 23 deletions.
17 changes: 6 additions & 11 deletions net/netfilter/xt_connlimit.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,11 @@ struct xt_connlimit_data {
spinlock_t lock;
};

static u_int32_t connlimit_rnd;
static bool connlimit_rnd_inited;
static u_int32_t connlimit_rnd __read_mostly;
static bool connlimit_rnd_inited __read_mostly;

static inline unsigned int connlimit_iphash(__be32 addr)
{
if (unlikely(!connlimit_rnd_inited)) {
get_random_bytes(&connlimit_rnd, sizeof(connlimit_rnd));
connlimit_rnd_inited = true;
}
return jhash_1word((__force __u32)addr, connlimit_rnd) & 0xFF;
}

Expand All @@ -59,11 +55,6 @@ connlimit_iphash6(const union nf_inet_addr *addr,
union nf_inet_addr res;
unsigned int i;

if (unlikely(!connlimit_rnd_inited)) {
get_random_bytes(&connlimit_rnd, sizeof(connlimit_rnd));
connlimit_rnd_inited = true;
}

for (i = 0; i < ARRAY_SIZE(addr->ip6); ++i)
res.ip6[i] = addr->ip6[i] & mask->ip6[i];

Expand Down Expand Up @@ -226,6 +217,10 @@ static bool connlimit_mt_check(const struct xt_mtchk_param *par)
struct xt_connlimit_info *info = par->matchinfo;
unsigned int i;

if (unlikely(!connlimit_rnd_inited)) {
get_random_bytes(&connlimit_rnd, sizeof(connlimit_rnd));
connlimit_rnd_inited = true;
}
if (nf_ct_l3proto_try_module_get(par->family) < 0) {
printk(KERN_WARNING "cannot load conntrack support for "
"address family %u\n", par->family);
Expand Down
20 changes: 8 additions & 12 deletions net/netfilter/xt_recent.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,25 +90,17 @@ static struct proc_dir_entry *recent_proc_dir;
static const struct file_operations recent_old_fops, recent_mt_fops;
#endif

static u_int32_t hash_rnd;
static bool hash_rnd_initted;
static u_int32_t hash_rnd __read_mostly;
static bool hash_rnd_inited __read_mostly;

static unsigned int recent_entry_hash4(const union nf_inet_addr *addr)
static inline unsigned int recent_entry_hash4(const union nf_inet_addr *addr)
{
if (!hash_rnd_initted) {
get_random_bytes(&hash_rnd, sizeof(hash_rnd));
hash_rnd_initted = true;
}
return jhash_1word((__force u32)addr->ip, hash_rnd) &
(ip_list_hash_size - 1);
}

static unsigned int recent_entry_hash6(const union nf_inet_addr *addr)
static inline unsigned int recent_entry_hash6(const union nf_inet_addr *addr)
{
if (!hash_rnd_initted) {
get_random_bytes(&hash_rnd, sizeof(hash_rnd));
hash_rnd_initted = true;
}
return jhash2((u32 *)addr->ip6, ARRAY_SIZE(addr->ip6), hash_rnd) &
(ip_list_hash_size - 1);
}
Expand Down Expand Up @@ -287,6 +279,10 @@ static bool recent_mt_check(const struct xt_mtchk_param *par)
unsigned i;
bool ret = false;

if (unlikely(!hash_rnd_inited)) {
get_random_bytes(&hash_rnd, sizeof(hash_rnd));
hash_rnd_inited = true;
}
if (hweight8(info->check_set &
(XT_RECENT_SET | XT_RECENT_REMOVE |
XT_RECENT_CHECK | XT_RECENT_UPDATE)) != 1)
Expand Down

0 comments on commit 294188a

Please sign in to comment.