|
@@ -1243,7 +1243,7 @@ static inline int policy_to_flow_dir(int dir)
|
|
|
}
|
|
|
|
|
|
static struct xfrm_policy *xfrm_sk_policy_lookup(const struct sock *sk, int dir,
|
|
|
- const struct flowi *fl)
|
|
|
+ const struct flowi *fl, u16 family)
|
|
|
{
|
|
|
struct xfrm_policy *pol;
|
|
|
|
|
@@ -1251,8 +1251,7 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(const struct sock *sk, int dir,
|
|
|
again:
|
|
|
pol = rcu_dereference(sk->sk_policy[dir]);
|
|
|
if (pol != NULL) {
|
|
|
- bool match = xfrm_selector_match(&pol->selector, fl,
|
|
|
- sk->sk_family);
|
|
|
+ bool match = xfrm_selector_match(&pol->selector, fl, family);
|
|
|
int err = 0;
|
|
|
|
|
|
if (match) {
|
|
@@ -2239,7 +2238,7 @@ struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
|
|
|
sk = sk_const_to_full_sk(sk);
|
|
|
if (sk && sk->sk_policy[XFRM_POLICY_OUT]) {
|
|
|
num_pols = 1;
|
|
|
- pols[0] = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl);
|
|
|
+ pols[0] = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl, family);
|
|
|
err = xfrm_expand_policies(fl, family, pols,
|
|
|
&num_pols, &num_xfrms);
|
|
|
if (err < 0)
|
|
@@ -2518,7 +2517,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
|
|
|
pol = NULL;
|
|
|
sk = sk_to_full_sk(sk);
|
|
|
if (sk && sk->sk_policy[dir]) {
|
|
|
- pol = xfrm_sk_policy_lookup(sk, dir, &fl);
|
|
|
+ pol = xfrm_sk_policy_lookup(sk, dir, &fl, family);
|
|
|
if (IS_ERR(pol)) {
|
|
|
XFRM_INC_STATS(net, LINUX_MIB_XFRMINPOLERROR);
|
|
|
return 0;
|
|
@@ -3069,6 +3068,11 @@ static int __net_init xfrm_net_init(struct net *net)
|
|
|
{
|
|
|
int rv;
|
|
|
|
|
|
+ /* Initialize the per-net locks here */
|
|
|
+ spin_lock_init(&net->xfrm.xfrm_state_lock);
|
|
|
+ spin_lock_init(&net->xfrm.xfrm_policy_lock);
|
|
|
+ mutex_init(&net->xfrm.xfrm_cfg_mutex);
|
|
|
+
|
|
|
rv = xfrm_statistics_init(net);
|
|
|
if (rv < 0)
|
|
|
goto out_statistics;
|
|
@@ -3085,11 +3089,6 @@ static int __net_init xfrm_net_init(struct net *net)
|
|
|
if (rv < 0)
|
|
|
goto out;
|
|
|
|
|
|
- /* Initialize the per-net locks here */
|
|
|
- spin_lock_init(&net->xfrm.xfrm_state_lock);
|
|
|
- spin_lock_init(&net->xfrm.xfrm_policy_lock);
|
|
|
- mutex_init(&net->xfrm.xfrm_cfg_mutex);
|
|
|
-
|
|
|
return 0;
|
|
|
|
|
|
out:
|