Message ID | 1328358402.2731.11.camel@edumazet-laptop |
---|---|
State | Rejected, archived |
Delegated to: | David Miller |
Headers | show |
Hello, On Sat, 4 Feb 2012, Eric Dumazet wrote: > Le vendredi 03 février 2012 à 16:15 +0100, Eric Dumazet a écrit : > > > We omit to send RST packet in tcp_v4_send_reset() > > > > because of this test : > > > > if (skb_rtable(skb)->rt_type != RTN_LOCAL) > > return > > > > At this point rt_type is RTN_UNICAST > > Here is the fix, thanks again ! > > [PATCH] ipv4: fix a route regression > > commit 813b3b5db83 (ipv4: Use caller's on-stack flowi as-is in output > route lookups.) added a regression. > > Some callers of ip_route_output_slow() assumed their flow argument was > constant. Problem with ip_route_connect? > ip_route_output_slow() must leave with original content of various > fields. There were attempts to provide more results for xfrm purposes: http://marc.info/?t=132251214300008&r=1&w=2 So, may be we need to go in this direction, not to restore original values but to provide more results. And callers should initialize all input arguments. > Thanks to Yurij M. Plotnikov for providing a bug report including a > program to reproduce the problem. > > Reported-by: Yurij M. Plotnikov <Yurij.Plotnikov@oktetlabs.ru> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> > --- > net/ipv4/route.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/net/ipv4/route.c b/net/ipv4/route.c > index bcacf54..0f63240 100644 > --- a/net/ipv4/route.c > +++ b/net/ipv4/route.c > @@ -2633,19 +2633,15 @@ static struct rtable *ip_route_output_slow(struct net *net, struct flowi4 *fl4) > unsigned int flags = 0; > struct fib_result res; > struct rtable *rth; > - __be32 orig_daddr; > - __be32 orig_saddr; > - int orig_oif; > + __be32 orig_daddr = fl4->daddr; > + __be32 orig_saddr = fl4->saddr; > + int orig_oif = fl4->flowi4_oif; > > res.fi = NULL; > #ifdef CONFIG_IP_MULTIPLE_TABLES > res.r = NULL; > #endif > > - orig_daddr = fl4->daddr; > - orig_saddr = fl4->saddr; > - orig_oif = fl4->flowi4_oif; > - > fl4->flowi4_iif = net->loopback_dev->ifindex; > fl4->flowi4_tos = tos & IPTOS_RT_MASK; > fl4->flowi4_scope = ((tos & RTO_ONLINK) ? > @@ -2816,6 +2812,9 @@ make_route: > > out: > rcu_read_unlock(); > + fl4->flowi4_oif = orig_oif; > + fl4->daddr = orig_daddr; > + fl4->saddr = orig_saddr; flowi4_tos is missing from this list but anyways, it looks wrong because __ip_route_output_key returns data in saddr and daddr, such change will break source address autoselection and destination address autoselection. That is what ip_route_connect is trying to do. May be ip_route_connect should be fixed instead? > return rth; > } Regards -- Julian Anastasov <ja@ssi.bg>
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Sat, 04 Feb 2012 13:26:42 +0100 > [PATCH] ipv4: fix a route regression Eric, you can't do this. The rest of the users depend upon the on-stack flow being fully resolved as a side effect of the route lookup. For example ip_route_connect() wants the source address et-al filled in for it. And the in-socket flow object that gets passed around expects the full flow key to be resolved by the route lookup path as well. Fix the case(s) that depend upon the flow not changing instead. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index bcacf54..0f63240 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2633,19 +2633,15 @@ static struct rtable *ip_route_output_slow(struct net *net, struct flowi4 *fl4) unsigned int flags = 0; struct fib_result res; struct rtable *rth; - __be32 orig_daddr; - __be32 orig_saddr; - int orig_oif; + __be32 orig_daddr = fl4->daddr; + __be32 orig_saddr = fl4->saddr; + int orig_oif = fl4->flowi4_oif; res.fi = NULL; #ifdef CONFIG_IP_MULTIPLE_TABLES res.r = NULL; #endif - orig_daddr = fl4->daddr; - orig_saddr = fl4->saddr; - orig_oif = fl4->flowi4_oif; - fl4->flowi4_iif = net->loopback_dev->ifindex; fl4->flowi4_tos = tos & IPTOS_RT_MASK; fl4->flowi4_scope = ((tos & RTO_ONLINK) ? @@ -2816,6 +2812,9 @@ make_route: out: rcu_read_unlock(); + fl4->flowi4_oif = orig_oif; + fl4->daddr = orig_daddr; + fl4->saddr = orig_saddr; return rth; }