From: Shirley Ma <mashirle@us.ibm.com>
To: "David S. Miller" <davem@redhat.com>
Cc: xma@us.ibm.com, yoshfuji@linux-ipv6.org, netdev@oss.sgi.com,
yoshfuji@cerberus.hongo.wide.ad.jp
Subject: Fix IPv6 MIBs counters in 2.6.5 kernel
Date: Mon, 5 Apr 2004 17:11:27 -0700 [thread overview]
Message-ID: <200404051711.27188.mashirle@us.ibm.com> (raw)
In-Reply-To: <20040405144213.198f76ea.davem@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 165 bytes --]
I have fixed IPv6 MIBs counters which don't increase under some cases
in linux-2.6.5 kernel.
Please review it.
--
Thanks
Shirley Ma
IBM Linux Technology Center
[-- Attachment #2: linux-2.6.5-oldmibs.patch --]
[-- Type: text/x-diff, Size: 9788 bytes --]
diff -urN linux-2.6.5/net/ipv6/exthdrs.c linux-2.6.5-oldmibs/net/ipv6/exthdrs.c
--- linux-2.6.5/net/ipv6/exthdrs.c 2004-04-03 19:36:15.000000000 -0800
+++ linux-2.6.5-oldmibs/net/ipv6/exthdrs.c 2004-04-05 15:34:44.325848720 -0700
@@ -159,6 +159,7 @@
if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) ||
!pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
kfree_skb(skb);
return -1;
}
@@ -171,6 +172,7 @@
return 1;
}
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
return -1;
}
@@ -234,6 +236,7 @@
if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr) ||
skb->pkt_type != PACKET_HOST) {
+ IP6_INC_STATS_BH(Ip6InAddrErrors);
kfree_skb(skb);
return -1;
}
@@ -249,11 +252,13 @@
}
if (hdr->type != IPV6_SRCRT_TYPE_0) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->type) - skb->nh.raw);
return -1;
}
if (hdr->hdrlen & 0x01) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->hdrlen) - skb->nh.raw);
return -1;
}
@@ -266,6 +271,7 @@
n = hdr->hdrlen >> 1;
if (hdr->segments_left > n) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->segments_left) - skb->nh.raw);
return -1;
}
@@ -276,8 +282,11 @@
if (skb_cloned(skb)) {
struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
kfree_skb(skb);
- if (skb2 == NULL)
+ /* the copy is a forwarded packet */
+ if (skb2 == NULL) {
+ IP6_INC_STATS_BH(Ip6OutDiscards);
return -1;
+ }
*skbp = skb = skb2;
opt = (struct inet6_skb_parm *)skb2->cb;
hdr = (struct ipv6_rt_hdr *) skb2->h.raw;
@@ -293,6 +302,7 @@
addr += i - 1;
if (ipv6_addr_is_multicast(addr)) {
+ IP6_INC_STATS_BH(Ip6InAddrErrors);
kfree_skb(skb);
return -1;
}
@@ -309,6 +319,7 @@
}
if (skb->dst->dev->flags&IFF_LOOPBACK) {
if (skb->nh.ipv6h->hop_limit <= 1) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
0, skb->dev);
kfree_skb(skb);
@@ -425,15 +436,18 @@
if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) {
if (net_ratelimit())
printk(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", skb->nh.raw[optoff+1]);
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
goto drop;
}
pkt_len = ntohl(*(u32*)(skb->nh.raw+optoff+2));
if (pkt_len <= IPV6_MAXPLEN) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2);
return 0;
}
if (skb->nh.ipv6h->payload_len) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff);
return 0;
}
diff -urN linux-2.6.5/net/ipv6/ip6_input.c linux-2.6.5-oldmibs/net/ipv6/ip6_input.c
--- linux-2.6.5/net/ipv6/ip6_input.c 2004-04-03 19:37:38.000000000 -0800
+++ linux-2.6.5-oldmibs/net/ipv6/ip6_input.c 2004-04-05 15:09:55.000000000 -0700
@@ -79,8 +79,10 @@
if (skb->len < sizeof(struct ipv6hdr))
goto err;
- if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
+ if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
goto drop;
+ }
hdr = skb->nh.ipv6h;
@@ -94,8 +96,10 @@
if (pkt_len + sizeof(struct ipv6hdr) > skb->len)
goto truncated;
if (pkt_len + sizeof(struct ipv6hdr) < skb->len) {
- if (__pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr)))
+ if (__pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr))){
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
goto drop;
+ }
hdr = skb->nh.ipv6h;
if (skb->ip_summed == CHECKSUM_HW)
skb->ip_summed = CHECKSUM_NONE;
@@ -206,6 +210,7 @@
return 0;
discard:
+ IP6_INC_STATS_BH(Ip6InDiscards);
rcu_read_unlock();
kfree_skb(skb);
return 0;
diff -urN linux-2.6.5/net/ipv6/ip6_output.c linux-2.6.5-oldmibs/net/ipv6/ip6_output.c
--- linux-2.6.5/net/ipv6/ip6_output.c 2004-04-03 19:36:16.000000000 -0800
+++ linux-2.6.5-oldmibs/net/ipv6/ip6_output.c 2004-04-05 15:09:55.000000000 -0700
@@ -87,6 +87,7 @@
} else if (dst->neighbour)
return dst->neighbour->output(skb);
+ IP6_INC_STATS_BH(Ip6OutNoRoutes);
kfree_skb(skb);
return -EINVAL;
@@ -131,6 +132,7 @@
ip6_dev_loopback_xmit);
if (skb->nh.ipv6h->hop_limit == 0) {
+ IP6_INC_STATS(Ip6OutDiscards);
kfree_skb(skb);
return 0;
}
@@ -167,6 +169,7 @@
dst = ip6_route_output(skb->sk, &fl);
if (dst->error) {
+ IP6_INC_STATS(Ip6OutNoRoutes);
if (net_ratelimit())
printk(KERN_DEBUG "ip6_route_me_harder: No more route.\n");
dst_release(dst);
@@ -224,8 +227,10 @@
struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room);
kfree_skb(skb);
skb = skb2;
- if (skb == NULL)
+ if (skb == NULL) {
+ IP6_INC_STATS(Ip6OutDiscards);
return -ENOBUFS;
+ }
if (sk)
skb_set_owner_w(skb, sk);
}
@@ -265,6 +270,7 @@
printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n");
skb->dev = dst->dev;
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
+ IP6_INC_STATS(Ip6FragFails);
kfree_skb(skb);
return -EMSGSIZE;
}
@@ -345,8 +351,10 @@
if (ipv6_devconf.forwarding == 0)
goto error;
- if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb))
+ if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
+ IP6_INC_STATS(Ip6InDiscards);
goto drop;
+ }
skb->ip_summed = CHECKSUM_NONE;
@@ -382,8 +390,10 @@
return -ETIMEDOUT;
}
- if (!xfrm6_route_forward(skb))
+ if (!xfrm6_route_forward(skb)) {
+ IP6_INC_STATS(Ip6InDiscards);
goto drop;
+ }
/* IPv6 specs say nothing about it, but it is clear that we cannot
send redirects to source routed frames.
@@ -420,12 +430,15 @@
skb->dev = dst->dev;
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, dst_pmtu(dst), skb->dev);
IP6_INC_STATS_BH(Ip6InTooBigErrors);
+ IP6_INC_STATS_BH(Ip6FragFails);
kfree_skb(skb);
return -EMSGSIZE;
}
- if (skb_cow(skb, dst->dev->hard_header_len))
+ if (skb_cow(skb, dst->dev->hard_header_len)) {
+ IP6_INC_STATS(Ip6OutDiscards);
goto drop;
+ }
hdr = skb->nh.ipv6h;
@@ -648,6 +661,7 @@
if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_RESERVED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) {
NETDEBUG(printk(KERN_INFO "IPv6: frag: no memory for new fragment!\n"));
+ IP6_INC_STATS(Ip6FragFails);
err = -ENOMEM;
goto fail;
}
@@ -1062,6 +1076,7 @@
ipv6_addr_copy(&hdr->daddr, final_dst);
skb->dst = dst_clone(&rt->u.dst);
+ IP6_INC_STATS(Ip6OutRequests);
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output);
if (err) {
if (err > 0)
@@ -1092,8 +1107,10 @@
struct ipv6_pinfo *np = inet6_sk(sk);
struct sk_buff *skb;
- while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL)
+ while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) {
+ IP6_INC_STATS(Ip6OutDiscards);
kfree_skb(skb);
+ }
inet->cork.flags &= ~IPCORK_OPT;
diff -urN linux-2.6.5/net/ipv6/ndisc.c linux-2.6.5-oldmibs/net/ipv6/ndisc.c
--- linux-2.6.5/net/ipv6/ndisc.c 2004-04-03 19:37:23.000000000 -0800
+++ linux-2.6.5-oldmibs/net/ipv6/ndisc.c 2004-04-05 15:09:55.000000000 -0700
@@ -452,6 +452,7 @@
skb->dst = dst;
idev = in6_dev_get(dst->dev);
+ IP6_INC_STATS(Ip6OutRequests);
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
if (!err) {
ICMP6_INC_STATS(idev, Icmp6OutNeighborAdvertisements);
@@ -535,6 +536,7 @@
/* send it! */
skb->dst = dst;
idev = in6_dev_get(dst->dev);
+ IP6_INC_STATS(Ip6OutRequests);
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
if (!err) {
ICMP6_INC_STATS(idev, Icmp6OutNeighborSolicits);
@@ -607,6 +609,7 @@
/* send it! */
skb->dst = dst;
idev = in6_dev_get(dst->dev);
+ IP6_INC_STATS(Ip6OutRequests);
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
if (!err) {
ICMP6_INC_STATS(idev, Icmp6OutRouterSolicits);
@@ -1332,6 +1335,7 @@
buff->dst = dst;
idev = in6_dev_get(dst->dev);
+ IP6_INC_STATS(Ip6OutRequests);
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, buff, NULL, dst->dev, dst_output);
if (!err) {
ICMP6_INC_STATS(idev, Icmp6OutRedirects);
diff -urN linux-2.6.5/net/ipv6/raw.c linux-2.6.5-oldmibs/net/ipv6/raw.c
--- linux-2.6.5/net/ipv6/raw.c 2004-04-03 19:36:56.000000000 -0800
+++ linux-2.6.5-oldmibs/net/ipv6/raw.c 2004-04-05 15:09:55.000000000 -0700
@@ -526,6 +526,7 @@
if (err)
goto error_fault;
+ IP6_INC_STATS(Ip6OutRequests);
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
dst_output);
if (err > 0)
diff -urN linux-2.6.5/net/ipv6/reassembly.c linux-2.6.5-oldmibs/net/ipv6/reassembly.c
--- linux-2.6.5/net/ipv6/reassembly.c 2004-04-03 19:36:55.000000000 -0800
+++ linux-2.6.5-oldmibs/net/ipv6/reassembly.c 2004-04-05 15:09:55.000000000 -0700
@@ -426,6 +426,7 @@
((u8 *) (fhdr + 1) - (u8 *) (skb->nh.ipv6h + 1)));
if ((unsigned int)end > IPV6_MAXPLEN) {
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw);
return;
}
@@ -452,6 +453,7 @@
/* RFC2460 says always send parameter problem in
* this case. -DaveM
*/
+ IP6_INC_STATS_BH(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
offsetof(struct ipv6hdr, payload_len));
return;
@@ -570,6 +572,7 @@
return;
err:
+ IP6_INC_STATS(Ip6ReasmFails);
kfree_skb(skb);
}
@@ -694,10 +697,12 @@
/* Jumbo payload inhibits frag. header */
if (hdr->payload_len==0) {
+ IP6_INC_STATS(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw);
return -1;
}
if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+sizeof(struct frag_hdr))) {
+ IP6_INC_STATS(Ip6InHdrErrors);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw);
return -1;
}
next prev parent reply other threads:[~2004-04-06 0:11 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-03-17 19:30 [PATCH]dump interface IPv6 multicast/anycast addresses through netlink Shirley Ma
2004-03-19 6:06 ` David S. Miller
2004-03-19 6:52 ` YOSHIFUJI Hideaki / 吉藤英明
2004-03-19 6:55 ` YOSHIFUJI Hideaki / 吉藤英明
2004-03-19 7:16 ` Shirley Ma
2004-03-19 7:32 ` David S. Miller
2004-03-19 8:03 ` Shirley Ma
2004-03-31 18:07 ` Shirley Ma
2004-04-01 4:50 ` YOSHIFUJI Hideaki / 吉藤英明
2004-04-01 5:18 ` Shirley Ma
2004-04-01 18:28 ` Shirley Ma
2004-04-03 22:45 ` David S. Miller
2004-04-05 20:51 ` Shirley Ma
2004-04-05 21:42 ` David S. Miller
2004-04-06 0:11 ` Shirley Ma [this message]
2004-04-09 23:27 ` Fix IPv6 MIBs counters in 2.6.5 kernel David S. Miller
2004-03-31 21:26 ` [PATCH]Add IPv6 MIBs counters in MLD (mcast.c) Shirley Ma
2004-04-03 22:30 ` David S. Miller
2004-05-26 20:10 ` [PATCH]Add new IPv6 MIBs counters support through netlink Shirley Ma
2004-05-26 20:22 ` David S. Miller
2004-05-26 20:42 ` Shirley Ma
2004-05-26 20:44 ` David S. Miller
2004-05-26 23:08 ` YOSHIFUJI Hideaki / 吉藤英明
2004-05-26 23:22 ` YOSHIFUJI Hideaki / 吉藤英明
2004-05-26 23:22 ` David S. Miller
2004-05-26 23:34 ` Shirley Ma
2004-05-26 23:32 ` Shirley Ma
2004-05-26 23:58 ` YOSHIFUJI Hideaki / 吉藤英明
2004-05-27 0:01 ` David S. Miller
2004-06-09 23:00 ` [PATCH] dst allocation problem in ndisc Shirley Ma
2004-06-10 2:12 ` YOSHIFUJI Hideaki / 吉藤英明
2004-06-10 20:05 ` Shirley Ma
2004-06-10 20:46 ` Shirley Ma
2004-06-11 5:08 ` David S. Miller
2004-06-09 23:29 ` [PATCH] some condition check error in ipsec v6 Shirley Ma
2004-06-10 1:48 ` YOSHIFUJI Hideaki / 吉藤英明
2004-06-11 5:11 ` David S. Miller
2004-05-26 20:19 ` [PATCH] pmtu check conditions error in IPv6 Shirley Ma
2004-05-26 20:24 ` David S. Miller
2004-05-26 20:50 ` [PATCH] IFA_MAX sets wrong in rtnetlink.h Shirley Ma
2004-05-26 20:56 ` David S. Miller
2004-05-28 4:48 ` YOSHIFUJI Hideaki / 吉藤英明
2004-05-28 5:07 ` David S. Miller
2004-05-28 5:12 ` YOSHIFUJI Hideaki / 吉藤英明
2004-05-28 9:25 ` YOSHIFUJI Hideaki / 吉藤英明
2004-05-29 19:36 ` David S. Miller
2004-05-28 9:27 ` YOSHIFUJI Hideaki / 吉藤英明
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200404051711.27188.mashirle@us.ibm.com \
--to=mashirle@us.ibm.com \
--cc=davem@redhat.com \
--cc=netdev@oss.sgi.com \
--cc=xma@us.ibm.com \
--cc=yoshfuji@cerberus.hongo.wide.ad.jp \
--cc=yoshfuji@linux-ipv6.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).