Skip to contentSkip to conversation

Fix SNMPv2 "ipOutNoRoutes" counter error

PATCH In review weidong 2 participants 2 messages Dec 4, 2006 – Dec 11, 2006

Subsystems (3)
lore
Share & tools
lore

weidong

author
#0 lore raw

PATCH 1/1 Fix SNMPv2 "ipOutNoRoutes" counter error

Hi All:
When I tested linux kernel 2.6.18.3, and find that kernel statistics
about IPSTATS_MIB_OUTNOROUTES which exsits in file /proc/net/snmp doesn't increase correctly. The criteria conform to RFC2011:

ipOutNoRoutes OBJECT-TYPE

    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current

DESCRIPTION
"The number of IP datagrams discarded because no route could be found to transmit them to their destination. Note that this counter includes any packets counted in ipForwDatagrams which meet this `no-route' criterion. Note that this includes any datagrams which a host cannot route because all of its default routers are down."
::= { ip 12 }

When a host received an IP packet, but the destination address is not this host. The kernel just discards the IP packet but with no increment for this counter.

When a router received an IP packet that this router can't forward due to no route found. Kernel just simply invoke ip_error(), and send ICMP packet. Also do nothing for this counter.

net/ipv4/icmp.c +3 -0
diff -ruN old/net/ipv4/icmp.c new/net/ipv4/icmp.c
@@ -580,6 +580,9 @@
 		icmp_param.data_len = room;
 	icmp_param.head_len = sizeof(struct icmphdr);
 
+	if (code == ICMP_NET_UNREACH)
+		IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
+
 	icmp_push_reply(&icmp_param, &ipc, rt);
 ende:
 	ip_rt_put(rt);
net/ipv4/ip_input.c +3 -1
diff -ruN old/net/ipv4/ip_input.c new/net/ipv4/ip_input.c
@@ -340,8 +340,10 @@
 		int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
 					 skb->dev);
 		if (unlikely(err)) {
-			if (err == -EHOSTUNREACH)
+			if (err == -EHOSTUNREACH) {
 				IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS);
+				IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
+			}
 			goto drop; 
 		}
 	}
maintainer
#1 lore raw

From: weidong <[email protected]>
Date: Tue, 05 Dec 2006 11:49:46 -0500

Quoted 22 lines

Hi All:
When I tested linux kernel 2.6.18.3, and find that kernel statistics
about IPSTATS_MIB_OUTNOROUTES which exsits in file /proc/net/snmp doesn't increase correctly. The criteria conform to RFC2011:

ipOutNoRoutes OBJECT-TYPE

    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current

DESCRIPTION
"The number of IP datagrams discarded because no route could be found to transmit them to their destination. Note that this counter includes any packets counted in ipForwDatagrams which meet this `no-route' criterion. Note that this includes any datagrams which a host cannot route because all of its default routers are down."
::= { ip 12 }

When a host received an IP packet, but the destination address is not this host. The kernel just discards the IP packet but with no increment for this counter.

Quoted 5 lines

When a router received an IP packet that this router can't forward due to no route found. Kernel just simply invoke ip_error(), and send ICMP packet. Also do nothing for this counter.

Hosts which have forwarding disabled, are not forwarding and therefore not routing in the sense being described here.

So bumping this counter when the ip_forward sysctl is "0" makes no sense.

We are not even getting to the "output" path when the route lookup fails in ip_rcv_finish(). This means this silly SNMP "output" route failed counter will get bumped like crazy when promiscuous mode is enabled on an interface, and that makes zero sense.

This patch, at least in it's current form, is not correct.