On Tue, 26 Feb 2008 18:59:08 +0900 Wei Yongjun <[EMAIL PROTECTED]> wrote:
> Jarek Poplawski wrote: > > Maybe ip_error() does not handle the ESRCH error. In this place ESRCH eq > to ENETUNREACH? > > static int ip_error(struct sk_buff *skb) > { > struct rtable *rt = (struct rtable*)skb->dst; > unsigned long now; > int code; > > switch (rt->u.dst.error) { > case EINVAL: > default: > goto out; > case EHOSTUNREACH: > code = ICMP_HOST_UNREACH; > break; > case ENETUNREACH: > code = ICMP_NET_UNREACH; > break; > case EACCES: > code = ICMP_PKT_FILTERED; > break; > } > ...............snip.................... > } > > > > > On 26-02-2008 07:34, Li Yewang wrote: > > > >> Hi All > >> > >> There is a bug about icmp netunreach. > >> If the kernel does not find a route for a packet, > >> it must send a icmp netunreach packet to the source host, > >> and discard the packet. But the kernel does not send > >> a icmp netunreach packet because of the fib_lookup > >> return value of -ESRCH when a route is not found. > >> > > > > ...or because some function doesn't handle -ESRCH return from > > fib_lookup? It seems changing this to -ESRCH was needed in some cases. > > And you don't explain enough why it can't be handled later (like in > > ipv4/route.c: ip_route_input_slow)? > > > > > > Regards, > > Jarek P. > > > > > >> Signed-off-by: Li Yewang <[EMAIL PROTECTED]> > >> > >> diff -Nurp net/core_back/fib_rules.c net/core/fib_rules.c > >> --- net/core_back/fib_rules.c 2008-02-25 13:15:37.000000000 +0800 > >> +++ net/core/fib_rules.c 2008-02-25 13:16:01.000000000 +0800 > >> @@ -188,7 +188,7 @@ jumped: > >> } > >> } > >> > >> - err = -ESRCH; > >> + err = -ENETUNREACH; > >> out: > >> rcu_read_unlock(); > >> > >> The switch shouldn't see a problem because ENETUNREACH is already substituted for ESRCH in: static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struct net_device *dev) { ... /* * Now we are ready to route packet. */ if ((err = fib_lookup(net, &fl, &res)) != 0) { if (!IN_DEV_FORWARD(in_dev)) goto e_hostunreach; goto no_route; ... no_route: RT_CACHE_STAT_INC(in_no_route); spec_dst = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE); res.type = RTN_UNREACHABLE; if (err == -ESRCH) err = -ENETUNREACH; goto local_input; -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html