提交 a624c108 编写于 作者: D David S. Miller

[XFRM]: Put more keys into destination hash function.

Besides the daddr, key the hash on family and reqid too.
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9d4a706d
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
......@@ -35,7 +35,7 @@ EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth);
/* Each xfrm_state may be linked to two tables:
1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
2. Hash table by daddr to find what SAs exist for given
2. Hash table by (daddr,family,reqid) to find what SAs exist for given
destination/tunnel endpoint. (output)
*/
......@@ -55,62 +55,56 @@ static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024;
static unsigned int xfrm_state_num;
static unsigned int xfrm_state_genid;
static inline unsigned int __xfrm4_dst_hash(xfrm_address_t *addr, unsigned int hmask)
static inline unsigned int __xfrm4_addr_hash(xfrm_address_t *addr)
{
unsigned int h;
h = ntohl(addr->a4);
h = (h ^ (h>>16)) & hmask;
return h;
}
static inline unsigned int __xfrm6_dst_hash(xfrm_address_t *addr, unsigned int hmask)
{
unsigned int h;
h = ntohl(addr->a6[2]^addr->a6[3]);
h = (h ^ (h>>16)) & hmask;
return h;
return ntohl(addr->a4);
}
static inline unsigned int __xfrm4_src_hash(xfrm_address_t *addr, unsigned int hmask)
static inline unsigned int __xfrm6_addr_hash(xfrm_address_t *addr)
{
return __xfrm4_dst_hash(addr, hmask);
return ntohl(addr->a6[2]^addr->a6[3]);
}
static inline unsigned int __xfrm6_src_hash(xfrm_address_t *addr, unsigned int hmask)
{
return __xfrm6_dst_hash(addr, hmask);
}
static inline unsigned __xfrm_src_hash(xfrm_address_t *addr, unsigned short family, unsigned int hmask)
static inline unsigned int __xfrm_dst_hash(xfrm_address_t *addr,
u32 reqid, unsigned short family,
unsigned int hmask)
{
unsigned int h = family ^ reqid;
switch (family) {
case AF_INET:
return __xfrm4_src_hash(addr, hmask);
h ^= __xfrm4_addr_hash(addr);
break;
case AF_INET6:
return __xfrm6_src_hash(addr, hmask);
}
return 0;
h ^= __xfrm6_addr_hash(addr);
break;
};
return (h ^ (h >> 16)) & hmask;
}
static inline unsigned xfrm_src_hash(xfrm_address_t *addr, unsigned short family)
static inline unsigned int xfrm_dst_hash(xfrm_address_t *addr, u32 reqid,
unsigned short family)
{
return __xfrm_src_hash(addr, family, xfrm_state_hmask);
return __xfrm_dst_hash(addr, reqid, family, xfrm_state_hmask);
}
static inline unsigned int __xfrm_dst_hash(xfrm_address_t *addr, unsigned short family, unsigned int hmask)
static inline unsigned __xfrm_src_hash(xfrm_address_t *addr, unsigned short family,
unsigned int hmask)
{
unsigned int h = family;
switch (family) {
case AF_INET:
return __xfrm4_dst_hash(addr, hmask);
h ^= __xfrm4_addr_hash(addr);
break;
case AF_INET6:
return __xfrm6_dst_hash(addr, hmask);
}
return 0;
h ^= __xfrm6_addr_hash(addr);
break;
};
return (h ^ (h >> 16)) & hmask;
}
static inline unsigned int xfrm_dst_hash(xfrm_address_t *addr, unsigned short family)
static inline unsigned xfrm_src_hash(xfrm_address_t *addr, unsigned short family)
{
return __xfrm_dst_hash(addr, family, xfrm_state_hmask);
return __xfrm_src_hash(addr, family, xfrm_state_hmask);
}
static inline unsigned int __xfrm4_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto,
......@@ -190,7 +184,8 @@ static void xfrm_hash_transfer(struct hlist_head *list,
hlist_for_each_entry_safe(x, entry, tmp, list, bydst) {
unsigned int h;
h = __xfrm_dst_hash(&x->id.daddr, x->props.family, nhashmask);
h = __xfrm_dst_hash(&x->id.daddr, x->props.reqid,
x->props.family, nhashmask);
hlist_add_head(&x->bydst, ndsttable+h);
h = __xfrm_src_hash(&x->props.saddr, x->props.family,
......@@ -635,7 +630,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
struct xfrm_policy *pol, int *err,
unsigned short family)
{
unsigned int h = xfrm_dst_hash(daddr, family);
unsigned int h = xfrm_dst_hash(daddr, tmpl->reqid, family);
struct hlist_node *entry;
struct xfrm_state *x, *x0;
int acquire_in_progress = 0;
......@@ -744,15 +739,15 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
static void __xfrm_state_insert(struct xfrm_state *x)
{
unsigned int h = xfrm_dst_hash(&x->id.daddr, x->props.family);
unsigned int h;
x->genid = ++xfrm_state_genid;
h = xfrm_dst_hash(&x->id.daddr, x->props.reqid, x->props.family);
hlist_add_head(&x->bydst, xfrm_state_bydst+h);
xfrm_state_hold(x);
h = xfrm_src_hash(&x->props.saddr, x->props.family);
hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
xfrm_state_hold(x);
......@@ -794,7 +789,7 @@ EXPORT_SYMBOL(xfrm_state_insert);
/* xfrm_state_lock is held */
static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 reqid, u8 proto, xfrm_address_t *daddr, xfrm_address_t *saddr, int create)
{
unsigned int h = xfrm_dst_hash(daddr, family);
unsigned int h = xfrm_dst_hash(daddr, reqid, family);
struct hlist_node *entry;
struct xfrm_state *x;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部