]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - net/xfrm/xfrm_policy.c
UBUNTU: Ubuntu-raspi2-4.10.0-1011.14
[mirror_ubuntu-zesty-kernel.git] / net / xfrm / xfrm_policy.c
index 177e208e8ff5091f0bc45e1bf75442a071d1cb33..a484c24a2a54ea5ff8f7d06de7355d6e79bbbca6 100644 (file)
@@ -2856,6 +2856,23 @@ static struct neighbour *xfrm_neigh_lookup(const struct dst_entry *dst,
        return dst->path->ops->neigh_lookup(dst, skb, daddr);
 }
 
+static void xfrm_confirm_neigh(const struct dst_entry *dst, const void *daddr)
+{
+       const struct dst_entry *path = dst->path;
+
+       for (; dst != path; dst = dst->child) {
+               const struct xfrm_state *xfrm = dst->xfrm;
+
+               if (xfrm->props.mode == XFRM_MODE_TRANSPORT)
+                       continue;
+               if (xfrm->type->flags & XFRM_TYPE_REMOTE_COADDR)
+                       daddr = xfrm->coaddr;
+               else if (!(xfrm->type->flags & XFRM_TYPE_LOCAL_COADDR))
+                       daddr = &xfrm->id.daddr;
+       }
+       path->ops->confirm_neigh(path, daddr);
+}
+
 int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
 {
        int err = 0;
@@ -2882,6 +2899,8 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
                        dst_ops->link_failure = xfrm_link_failure;
                if (likely(dst_ops->neigh_lookup == NULL))
                        dst_ops->neigh_lookup = xfrm_neigh_lookup;
+               if (likely(!dst_ops->confirm_neigh))
+                       dst_ops->confirm_neigh = xfrm_confirm_neigh;
                if (likely(afinfo->garbage_collect == NULL))
                        afinfo->garbage_collect = xfrm_garbage_collect_deferred;
                rcu_assign_pointer(xfrm_policy_afinfo[afinfo->family], afinfo);
@@ -3062,6 +3081,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;
@@ -3078,11 +3102,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: