]> Pileus Git - ~andy/linux/blobdiff - net/xfrm/xfrm_policy.c
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
[~andy/linux] / net / xfrm / xfrm_policy.c
index ccfbd328a69d7948736157555bfa857236875156..c5a5165a5927a185043bdc83e8c9c4e25f549753 100644 (file)
@@ -1350,11 +1350,12 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
        default:
                BUG();
        }
-       xdst = dst_alloc(dst_ops, NULL, 0, 0, 0);
+       xdst = dst_alloc(dst_ops, NULL, 0, DST_OBSOLETE_NONE, 0);
 
        if (likely(xdst)) {
-               memset(&xdst->u.rt6.rt6i_table, 0,
-                       sizeof(*xdst) - sizeof(struct dst_entry));
+               struct dst_entry *dst = &xdst->u.dst;
+
+               memset(dst + 1, 0, sizeof(*xdst) - sizeof(*dst));
                xdst->flo.ops = &xfrm_bundle_fc_ops;
        } else
                xdst = ERR_PTR(-ENOBUFS);
@@ -1476,7 +1477,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
                dst1->xfrm = xfrm[i];
                xdst->xfrm_genid = xfrm[i]->genid;
 
-               dst1->obsolete = -1;
+               dst1->obsolete = DST_OBSOLETE_FORCE_CHK;
                dst1->flags |= DST_HOST;
                dst1->lastuse = now;
 
@@ -1500,9 +1501,6 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
        if (!dev)
                goto free_dst;
 
-       /* Copy neighbour for reachability confirmation */
-       dst_set_neighbour(dst0, neigh_clone(dst_get_neighbour_noref(dst)));
-
        xfrm_init_path((struct xfrm_dst *)dst0, dst, nfheader_len);
        xfrm_init_pmtu(dst_prev);
 
@@ -2221,12 +2219,13 @@ EXPORT_SYMBOL(__xfrm_route_forward);
 static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
 {
        /* Code (such as __xfrm4_bundle_create()) sets dst->obsolete
-        * to "-1" to force all XFRM destinations to get validated by
-        * dst_ops->check on every use.  We do this because when a
-        * normal route referenced by an XFRM dst is obsoleted we do
-        * not go looking around for all parent referencing XFRM dsts
-        * so that we can invalidate them.  It is just too much work.
-        * Instead we make the checks here on every use.  For example:
+        * to DST_OBSOLETE_FORCE_CHK to force all XFRM destinations to
+        * get validated by dst_ops->check on every use.  We do this
+        * because when a normal route referenced by an XFRM dst is
+        * obsoleted we do not go looking around for all parent
+        * referencing XFRM dsts so that we can invalidate them.  It
+        * is just too much work.  Instead we make the checks here on
+        * every use.  For example:
         *
         *      XFRM dst A --> IPv4 dst X
         *
@@ -2236,9 +2235,9 @@ static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
         * stale_bundle() check.
         *
         * When a policy's bundle is pruned, we dst_free() the XFRM
-        * dst which causes it's ->obsolete field to be set to a
-        * positive non-zero integer.  If an XFRM dst has been pruned
-        * like this, we want to force a new route lookup.
+        * dst which causes it's ->obsolete field to be set to
+        * DST_OBSOLETE_DEAD.  If an XFRM dst has been pruned like
+        * this, we want to force a new route lookup.
         */
        if (dst->obsolete < 0 && !stale_bundle(dst))
                return dst;
@@ -2404,9 +2403,11 @@ static unsigned int xfrm_mtu(const struct dst_entry *dst)
        return mtu ? : dst_mtu(dst->path);
 }
 
-static struct neighbour *xfrm_neigh_lookup(const struct dst_entry *dst, const void *daddr)
+static struct neighbour *xfrm_neigh_lookup(const struct dst_entry *dst,
+                                          struct sk_buff *skb,
+                                          const void *daddr)
 {
-       return dst_neigh_lookup(dst->path, daddr);
+       return dst->path->ops->neigh_lookup(dst, skb, daddr);
 }
 
 int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)