]> err.no Git - linux-2.6/commitdiff
[IPV6]: SNMPv2 "ipv6IfStatsInAddrErrors" counter error
authorLv Liangying <lvly@nanjing-fnst.com>
Tue, 29 Aug 2006 07:00:47 +0000 (00:00 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 30 Aug 2006 04:22:15 +0000 (21:22 -0700)
   When I tested Linux kernel 2.6.17.7 about statistics
"ipv6IfStatsInAddrErrors", found that this counter couldn't increase
correctly. The criteria is RFC2465:
 ipv6IfStatsInAddrErrors OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
         "The number of input datagrams discarded because
         the IPv6 address in their IPv6 header's destination
         field was not a valid address to be received at
         this entity.  This count includes invalid
         addresses (e.g., ::0) and unsupported addresses
         (e.g., addresses with unallocated prefixes).  For
         entities which are not IPv6 routers and therefore
         do not forward datagrams, this counter includes
         datagrams discarded because the destination address
         was not a local address."
      ::= { ipv6IfStatsEntry 5 }

When I send packet to host with destination that is ether invalid
address(::0) or unsupported addresses(1::1), the Linux kernel just
discard the packet, and the counter doesn't increase(in the function
ip6_pkt_discard).

Signed-off-by: Lv Liangying <lvly@nanjing-fnst.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/route.c

index 4b163711f3a86382609d925b62e5d3e52cc1b4b7..d9baca062d24c1dddbb2216b5959420df1ff6a8c 100644 (file)
@@ -1532,6 +1532,10 @@ int ipv6_route_ioctl(unsigned int cmd, void __user *arg)
 
 static int ip6_pkt_discard(struct sk_buff *skb)
 {
+       int type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
+       if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED)
+               IP6_INC_STATS(IPSTATS_MIB_INADDRERRORS);
+
        IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES);
        icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev);
        kfree_skb(skb);