Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a5dc9e5 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: Add MIB counters for checksum errors



Add MIB counters for checksum errors in IP layer,
and TCP/UDP/ICMP layers, to help diagnose problems.

$ nstat -a | grep  Csum
IcmpInCsumErrors                72                 0.0
TcpInCsumErrors                 382                0.0
UdpInCsumErrors                 463221             0.0
Icmp6InCsumErrors               75                 0.0
Udp6InCsumErrors                173442             0.0
IpExtInCsumErrors               10884              0.0

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f233a976
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ enum
	IPSTATS_MIB_OUTMCASTOCTETS,		/* OutMcastOctets */
	IPSTATS_MIB_OUTMCASTOCTETS,		/* OutMcastOctets */
	IPSTATS_MIB_INBCASTOCTETS,		/* InBcastOctets */
	IPSTATS_MIB_INBCASTOCTETS,		/* InBcastOctets */
	IPSTATS_MIB_OUTBCASTOCTETS,		/* OutBcastOctets */
	IPSTATS_MIB_OUTBCASTOCTETS,		/* OutBcastOctets */
	IPSTATS_MIB_CSUMERRORS,			/* InCsumErrors */
	__IPSTATS_MIB_MAX
	__IPSTATS_MIB_MAX
};
};


@@ -87,6 +88,7 @@ enum
	ICMP_MIB_OUTTIMESTAMPREPS,		/* OutTimestampReps */
	ICMP_MIB_OUTTIMESTAMPREPS,		/* OutTimestampReps */
	ICMP_MIB_OUTADDRMASKS,			/* OutAddrMasks */
	ICMP_MIB_OUTADDRMASKS,			/* OutAddrMasks */
	ICMP_MIB_OUTADDRMASKREPS,		/* OutAddrMaskReps */
	ICMP_MIB_OUTADDRMASKREPS,		/* OutAddrMaskReps */
	ICMP_MIB_CSUMERRORS,			/* InCsumErrors */
	__ICMP_MIB_MAX
	__ICMP_MIB_MAX
};
};


@@ -103,6 +105,7 @@ enum
	ICMP6_MIB_INERRORS,			/* InErrors */
	ICMP6_MIB_INERRORS,			/* InErrors */
	ICMP6_MIB_OUTMSGS,			/* OutMsgs */
	ICMP6_MIB_OUTMSGS,			/* OutMsgs */
	ICMP6_MIB_OUTERRORS,			/* OutErrors */
	ICMP6_MIB_OUTERRORS,			/* OutErrors */
	ICMP6_MIB_CSUMERRORS,			/* InCsumErrors */
	__ICMP6_MIB_MAX
	__ICMP6_MIB_MAX
};
};


@@ -130,6 +133,7 @@ enum
	TCP_MIB_RETRANSSEGS,			/* RetransSegs */
	TCP_MIB_RETRANSSEGS,			/* RetransSegs */
	TCP_MIB_INERRS,				/* InErrs */
	TCP_MIB_INERRS,				/* InErrs */
	TCP_MIB_OUTRSTS,			/* OutRsts */
	TCP_MIB_OUTRSTS,			/* OutRsts */
	TCP_MIB_CSUMERRORS,			/* InCsumErrors */
	__TCP_MIB_MAX
	__TCP_MIB_MAX
};
};


@@ -147,6 +151,7 @@ enum
	UDP_MIB_OUTDATAGRAMS,			/* OutDatagrams */
	UDP_MIB_OUTDATAGRAMS,			/* OutDatagrams */
	UDP_MIB_RCVBUFERRORS,			/* RcvbufErrors */
	UDP_MIB_RCVBUFERRORS,			/* RcvbufErrors */
	UDP_MIB_SNDBUFERRORS,			/* SndbufErrors */
	UDP_MIB_SNDBUFERRORS,			/* SndbufErrors */
	UDP_MIB_CSUMERRORS,			/* InCsumErrors */
	__UDP_MIB_MAX
	__UDP_MIB_MAX
};
};


+3 −1
Original line number Original line Diff line number Diff line
@@ -881,7 +881,7 @@ int icmp_rcv(struct sk_buff *skb)
	case CHECKSUM_NONE:
	case CHECKSUM_NONE:
		skb->csum = 0;
		skb->csum = 0;
		if (__skb_checksum_complete(skb))
		if (__skb_checksum_complete(skb))
			goto error;
			goto csum_error;
	}
	}


	if (!pskb_pull(skb, sizeof(*icmph)))
	if (!pskb_pull(skb, sizeof(*icmph)))
@@ -929,6 +929,8 @@ int icmp_rcv(struct sk_buff *skb)
drop:
drop:
	kfree_skb(skb);
	kfree_skb(skb);
	return 0;
	return 0;
csum_error:
	ICMP_INC_STATS_BH(net, ICMP_MIB_CSUMERRORS);
error:
error:
	ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
	ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
	goto drop;
	goto drop;
+3 −1
Original line number Original line Diff line number Diff line
@@ -419,7 +419,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
	iph = ip_hdr(skb);
	iph = ip_hdr(skb);


	if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
	if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
		goto inhdr_error;
		goto csum_error;


	len = ntohs(iph->tot_len);
	len = ntohs(iph->tot_len);
	if (skb->len < len) {
	if (skb->len < len) {
@@ -446,6 +446,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
	return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,
	return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,
		       ip_rcv_finish);
		       ip_rcv_finish);


csum_error:
	IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_CSUMERRORS);
inhdr_error:
inhdr_error:
	IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INHDRERRORS);
	IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INHDRERRORS);
drop:
drop:
+7 −3
Original line number Original line Diff line number Diff line
@@ -125,6 +125,7 @@ static const struct snmp_mib snmp4_ipextstats_list[] = {
	SNMP_MIB_ITEM("OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS),
	SNMP_MIB_ITEM("OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS),
	SNMP_MIB_ITEM("InBcastOctets", IPSTATS_MIB_INBCASTOCTETS),
	SNMP_MIB_ITEM("InBcastOctets", IPSTATS_MIB_INBCASTOCTETS),
	SNMP_MIB_ITEM("OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS),
	SNMP_MIB_ITEM("OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS),
	SNMP_MIB_ITEM("InCsumErrors", IPSTATS_MIB_CSUMERRORS),
	SNMP_MIB_SENTINEL
	SNMP_MIB_SENTINEL
};
};


@@ -162,6 +163,7 @@ static const struct snmp_mib snmp4_tcp_list[] = {
	SNMP_MIB_ITEM("RetransSegs", TCP_MIB_RETRANSSEGS),
	SNMP_MIB_ITEM("RetransSegs", TCP_MIB_RETRANSSEGS),
	SNMP_MIB_ITEM("InErrs", TCP_MIB_INERRS),
	SNMP_MIB_ITEM("InErrs", TCP_MIB_INERRS),
	SNMP_MIB_ITEM("OutRsts", TCP_MIB_OUTRSTS),
	SNMP_MIB_ITEM("OutRsts", TCP_MIB_OUTRSTS),
	SNMP_MIB_ITEM("InCsumErrors", TCP_MIB_CSUMERRORS),
	SNMP_MIB_SENTINEL
	SNMP_MIB_SENTINEL
};
};


@@ -172,6 +174,7 @@ static const struct snmp_mib snmp4_udp_list[] = {
	SNMP_MIB_ITEM("OutDatagrams", UDP_MIB_OUTDATAGRAMS),
	SNMP_MIB_ITEM("OutDatagrams", UDP_MIB_OUTDATAGRAMS),
	SNMP_MIB_ITEM("RcvbufErrors", UDP_MIB_RCVBUFERRORS),
	SNMP_MIB_ITEM("RcvbufErrors", UDP_MIB_RCVBUFERRORS),
	SNMP_MIB_ITEM("SndbufErrors", UDP_MIB_SNDBUFERRORS),
	SNMP_MIB_ITEM("SndbufErrors", UDP_MIB_SNDBUFERRORS),
	SNMP_MIB_ITEM("InCsumErrors", UDP_MIB_CSUMERRORS),
	SNMP_MIB_SENTINEL
	SNMP_MIB_SENTINEL
};
};


@@ -322,15 +325,16 @@ static void icmp_put(struct seq_file *seq)
	struct net *net = seq->private;
	struct net *net = seq->private;
	atomic_long_t *ptr = net->mib.icmpmsg_statistics->mibs;
	atomic_long_t *ptr = net->mib.icmpmsg_statistics->mibs;


	seq_puts(seq, "\nIcmp: InMsgs InErrors");
	seq_puts(seq, "\nIcmp: InMsgs InErrors InCsumErrors");
	for (i=0; icmpmibmap[i].name != NULL; i++)
	for (i=0; icmpmibmap[i].name != NULL; i++)
		seq_printf(seq, " In%s", icmpmibmap[i].name);
		seq_printf(seq, " In%s", icmpmibmap[i].name);
	seq_printf(seq, " OutMsgs OutErrors");
	seq_printf(seq, " OutMsgs OutErrors");
	for (i=0; icmpmibmap[i].name != NULL; i++)
	for (i=0; icmpmibmap[i].name != NULL; i++)
		seq_printf(seq, " Out%s", icmpmibmap[i].name);
		seq_printf(seq, " Out%s", icmpmibmap[i].name);
	seq_printf(seq, "\nIcmp: %lu %lu",
	seq_printf(seq, "\nIcmp: %lu %lu %lu",
		snmp_fold_field((void __percpu **) net->mib.icmp_statistics, ICMP_MIB_INMSGS),
		snmp_fold_field((void __percpu **) net->mib.icmp_statistics, ICMP_MIB_INMSGS),
		snmp_fold_field((void __percpu **) net->mib.icmp_statistics, ICMP_MIB_INERRORS));
		snmp_fold_field((void __percpu **) net->mib.icmp_statistics, ICMP_MIB_INERRORS),
		snmp_fold_field((void __percpu **) net->mib.icmp_statistics, ICMP_MIB_CSUMERRORS));
	for (i=0; icmpmibmap[i].name != NULL; i++)
	for (i=0; icmpmibmap[i].name != NULL; i++)
		seq_printf(seq, " %lu",
		seq_printf(seq, " %lu",
			   atomic_long_read(ptr + icmpmibmap[i].index));
			   atomic_long_read(ptr + icmpmibmap[i].index));
+1 −0
Original line number Original line Diff line number Diff line
@@ -5273,6 +5273,7 @@ step5:
	return 0;
	return 0;


csum_error:
csum_error:
	TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_CSUMERRORS);
	TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
	TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);


discard:
discard:
Loading