Hi, When kernel receives a package with a wrong destination ipv4 address, it can't increase "InAddrErrors" number correctly. InAddrErrors is located in /proc/net/snmp.
This is a patch for fixing this problem. Signed-off-by: Gui Jianfeng <[EMAIL PROTECTED]> --- diff -Narup linux-2.4.35.3/net/ipv4/ip_input.c linux-2.4.35.3-prep/net/ipv4/ip_input.c --- linux-2.4.35.3/net/ipv4/ip_input.c 2007-09-24 06:02:58.000000000 +0800 +++ linux-2.4.35.3-prep/net/ipv4/ip_input.c 2007-09-26 01:24:08.000000000 +0800 @@ -310,8 +310,12 @@ static inline int ip_rcv_finish(struct s * how the packet travels inside Linux networking. */ if (skb->dst == NULL) { - if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev)) - goto drop; + int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev); + if (unlikely(err)) { + if (err == -EHOSTUNREACH) + IP_INC_STATS_BH(IpInAddrErrors); + } + goto drop; } #ifdef CONFIG_NET_CLS_ROUTE diff -Narup linux-2.4.35.3/net/ipv4/route.c linux-2.4.35.3-prep/net/ipv4/route.c --- linux-2.4.35.3/net/ipv4/route.c 2007-09-24 06:02:58.000000000 +0800 +++ linux-2.4.35.3-prep/net/ipv4/route.c 2007-09-26 01:26:15.000000000 +0800 @@ -1450,7 +1450,7 @@ int ip_route_input_slow(struct sk_buff * */ if ((err = fib_lookup(&key, &res)) != 0) { if (!IN_DEV_FORWARD(in_dev)) - goto e_inval; + goto e_hostunreach; goto no_route; } free_res = 1; @@ -1499,7 +1499,7 @@ int ip_route_input_slow(struct sk_buff * } if (!IN_DEV_FORWARD(in_dev)) - goto e_inval; + goto e_hostunreach; if (res.type != RTN_UNICAST) goto martian_destination; @@ -1668,6 +1668,11 @@ martian_destination: "%u.%u.%u.%u, dev %s\n", NIPQUAD(daddr), NIPQUAD(saddr), dev->name); #endif + +e_hostunreach: + err = -EHOSTUNREACH; + goto done; + e_inval: err = -EINVAL; goto done; - 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