[XFRM]: Fix wildcard as tunnel source
Hashing SAs by source address breaks templates with wildcards as tunnel source since the source address used for hashing/lookup is still 0/0. Move source address lookup to xfrm_tmpl_resolve_one() so we can use the real address in the lookup. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
1ef9696c90
commit
a1e59abf82
@@ -42,22 +42,6 @@ __xfrm6_init_tempsel(struct xfrm_state *x, struct flowi *fl,
|
||||
memcpy(&x->props.saddr, &tmpl->saddr, sizeof(x->props.saddr));
|
||||
if (ipv6_addr_any((struct in6_addr*)&x->props.saddr))
|
||||
memcpy(&x->props.saddr, saddr, sizeof(x->props.saddr));
|
||||
if (tmpl->mode == XFRM_MODE_TUNNEL && ipv6_addr_any((struct in6_addr*)&x->props.saddr)) {
|
||||
struct rt6_info *rt;
|
||||
struct flowi fl_tunnel = {
|
||||
.nl_u = {
|
||||
.ip6_u = {
|
||||
.daddr = *(struct in6_addr *)daddr,
|
||||
}
|
||||
}
|
||||
};
|
||||
if (!xfrm_dst_lookup((struct xfrm_dst **)&rt,
|
||||
&fl_tunnel, AF_INET6)) {
|
||||
ipv6_get_saddr(&rt->u.dst, (struct in6_addr *)daddr,
|
||||
(struct in6_addr *)&x->props.saddr);
|
||||
dst_release(&rt->u.dst);
|
||||
}
|
||||
}
|
||||
x->props.mode = tmpl->mode;
|
||||
x->props.reqid = tmpl->reqid;
|
||||
x->props.family = AF_INET6;
|
||||
|
Reference in New Issue
Block a user