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

Reply via email to