ipv4: Make sure flowi4->{saddr,daddr} are always set.
Slow path output route resolution always makes sure that ->{saddr,daddr} are set, and also if we trigger into IPSEC resolution we initialize them as well, because xfrm_lookup() expects them to be fully resolved. But if we hit the fast path and flowi4->flowi4_proto is zero, we won't do this initialization. Therefore, move the IPSEC path initialization to the route cache lookup fast path to make sure these are always set. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
14ad2513ed
commit
5615787257
1 changed files with 5 additions and 6 deletions
|
@ -2675,6 +2675,10 @@ struct rtable *__ip_route_output_key(struct net *net, struct flowi4 *flp4)
|
|||
dst_use(&rth->dst, jiffies);
|
||||
RT_CACHE_STAT_INC(out_hit);
|
||||
rcu_read_unlock_bh();
|
||||
if (!flp4->saddr)
|
||||
flp4->saddr = rth->rt_src;
|
||||
if (!flp4->daddr)
|
||||
flp4->daddr = rth->rt_dst;
|
||||
return rth;
|
||||
}
|
||||
RT_CACHE_STAT_INC(out_hlist_search);
|
||||
|
@ -2772,15 +2776,10 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4,
|
|||
if (IS_ERR(rt))
|
||||
return rt;
|
||||
|
||||
if (flp4->flowi4_proto) {
|
||||
if (!flp4->saddr)
|
||||
flp4->saddr = rt->rt_src;
|
||||
if (!flp4->daddr)
|
||||
flp4->daddr = rt->rt_dst;
|
||||
if (flp4->flowi4_proto)
|
||||
rt = (struct rtable *) xfrm_lookup(net, &rt->dst,
|
||||
flowi4_to_flowi(flp4),
|
||||
sk, 0);
|
||||
}
|
||||
|
||||
return rt;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue