aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/xfrm6_policy.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/xfrm6_policy.c')
-rw-r--r--net/ipv6/xfrm6_policy.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
index 77dc3651437e..3b38e493d151 100644
--- a/net/ipv6/xfrm6_policy.c
+++ b/net/ipv6/xfrm6_policy.c
@@ -87,20 +87,16 @@ __xfrm6_find_bundle(struct flowi *fl, struct xfrm_policy *policy)
87 return dst; 87 return dst;
88} 88}
89 89
90static inline struct in6_addr* 90static inline xfrm_address_t *__xfrm6_bundle_addr_remote(struct xfrm_state *x)
91__xfrm6_bundle_addr_remote(struct xfrm_state *x, struct in6_addr *addr)
92{ 91{
93 return (x->type->remote_addr) ? 92 return (x->type->flags & XFRM_TYPE_REMOTE_COADDR) ? x->coaddr :
94 (struct in6_addr*)x->type->remote_addr(x, (xfrm_address_t *)addr) : 93 &x->id.daddr;
95 (struct in6_addr*)&x->id.daddr;
96} 94}
97 95
98static inline struct in6_addr* 96static inline xfrm_address_t *__xfrm6_bundle_addr_local(struct xfrm_state *x)
99__xfrm6_bundle_addr_local(struct xfrm_state *x, struct in6_addr *addr)
100{ 97{
101 return (x->type->local_addr) ? 98 return (x->type->flags & XFRM_TYPE_LOCAL_COADDR) ? x->coaddr :
102 (struct in6_addr*)x->type->local_addr(x, (xfrm_address_t *)addr) : 99 &x->props.saddr;
103 (struct in6_addr*)&x->props.saddr;
104} 100}
105 101
106/* Allocate chain of dst_entry's, attach known xfrm's, calculate 102/* Allocate chain of dst_entry's, attach known xfrm's, calculate
@@ -171,9 +167,9 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
171 fl_tunnel.fl4_src = xfrm[i]->props.saddr.a4; 167 fl_tunnel.fl4_src = xfrm[i]->props.saddr.a4;
172 break; 168 break;
173 case AF_INET6: 169 case AF_INET6:
174 ipv6_addr_copy(&fl_tunnel.fl6_dst, __xfrm6_bundle_addr_remote(xfrm[i], &fl->fl6_dst)); 170 ipv6_addr_copy(&fl_tunnel.fl6_dst, (struct in6_addr *)__xfrm6_bundle_addr_remote(xfrm[i]));
175 171
176 ipv6_addr_copy(&fl_tunnel.fl6_src, __xfrm6_bundle_addr_local(xfrm[i], &fl->fl6_src)); 172 ipv6_addr_copy(&fl_tunnel.fl6_src, (struct in6_addr *)__xfrm6_bundle_addr_local(xfrm[i]));
177 break; 173 break;
178 default: 174 default:
179 BUG_ON(1); 175 BUG_ON(1);