xfrm: Move child route linkage into xfrm_dst.
XFRM bundle child chains look like this: xdst1 --> xdst2 --> xdst3 --> path_dst All of xdstN are xfrm_dst objects and xdst->u.dst.xfrm is non-NULL. The final child pointer in the chain, here called 'path_dst', is some other kind of route such as an ipv4 or ipv6 one. The xfrm output path pops routes, one at a time, via the child pointer, until we hit one which has a dst->xfrm pointer which is NULL. We can easily preserve the above mechanisms with child sitting only in the xfrm_dst structure. All children in the chain before we break out of the xfrm_output() loop have dst->xfrm non-NULL and are therefore xfrm_dst objects. Since we break out of the loop when we find dst->xfrm NULL, we will not try to dereference 'dst' as if it were an xfrm_dst. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
45b018bedd
commit
b6ca8bd5a9
@@ -35,7 +35,6 @@ struct sk_buff;
|
||||
struct dst_entry {
|
||||
struct net_device *dev;
|
||||
struct rcu_head rcu_head;
|
||||
struct dst_entry *child;
|
||||
struct dst_ops *ops;
|
||||
unsigned long _metrics;
|
||||
unsigned long expires;
|
||||
@@ -89,7 +88,7 @@ struct dst_entry {
|
||||
* Align __refcnt to a 64 bytes alignment
|
||||
* (L1_CACHE_SIZE would be too much)
|
||||
*/
|
||||
long __pad_to_align_refcnt[2];
|
||||
long __pad_to_align_refcnt[3];
|
||||
#endif
|
||||
/*
|
||||
* __refcnt wants to be on a different cache line from
|
||||
|
||||
Reference in New Issue
Block a user