diff options
author | Eric Dumazet <edumazet@google.com> | 2013-04-29 04:39:56 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-29 15:14:03 -0400 |
commit | 6a5dc9e598fe90160fee7de098fa319665f5253e (patch) | |
tree | 7f2c2130e3dec81aea01e997cec7e87744f02694 /net/ipv6/tcp_ipv6.c | |
parent | f233a976ad15c3b8c54c0157f3c41d23f7514279 (diff) |
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: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index e51bd1a58264..71167069b394 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1405,6 +1405,7 @@ discard: | |||
1405 | kfree_skb(skb); | 1405 | kfree_skb(skb); |
1406 | return 0; | 1406 | return 0; |
1407 | csum_err: | 1407 | csum_err: |
1408 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_CSUMERRORS); | ||
1408 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); | 1409 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); |
1409 | goto discard; | 1410 | goto discard; |
1410 | 1411 | ||
@@ -1466,7 +1467,7 @@ static int tcp_v6_rcv(struct sk_buff *skb) | |||
1466 | goto discard_it; | 1467 | goto discard_it; |
1467 | 1468 | ||
1468 | if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb)) | 1469 | if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb)) |
1469 | goto bad_packet; | 1470 | goto csum_error; |
1470 | 1471 | ||
1471 | th = tcp_hdr(skb); | 1472 | th = tcp_hdr(skb); |
1472 | hdr = ipv6_hdr(skb); | 1473 | hdr = ipv6_hdr(skb); |
@@ -1530,6 +1531,8 @@ no_tcp_socket: | |||
1530 | goto discard_it; | 1531 | goto discard_it; |
1531 | 1532 | ||
1532 | if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) { | 1533 | if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) { |
1534 | csum_error: | ||
1535 | TCP_INC_STATS_BH(net, TCP_MIB_CSUMERRORS); | ||
1533 | bad_packet: | 1536 | bad_packet: |
1534 | TCP_INC_STATS_BH(net, TCP_MIB_INERRS); | 1537 | TCP_INC_STATS_BH(net, TCP_MIB_INERRS); |
1535 | } else { | 1538 | } else { |
@@ -1537,11 +1540,6 @@ bad_packet: | |||
1537 | } | 1540 | } |
1538 | 1541 | ||
1539 | discard_it: | 1542 | discard_it: |
1540 | |||
1541 | /* | ||
1542 | * Discard frame | ||
1543 | */ | ||
1544 | |||
1545 | kfree_skb(skb); | 1543 | kfree_skb(skb); |
1546 | return 0; | 1544 | return 0; |
1547 | 1545 | ||
@@ -1555,10 +1553,13 @@ do_time_wait: | |||
1555 | goto discard_it; | 1553 | goto discard_it; |
1556 | } | 1554 | } |
1557 | 1555 | ||
1558 | if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) { | 1556 | if (skb->len < (th->doff<<2)) { |
1559 | TCP_INC_STATS_BH(net, TCP_MIB_INERRS); | ||
1560 | inet_twsk_put(inet_twsk(sk)); | 1557 | inet_twsk_put(inet_twsk(sk)); |
1561 | goto discard_it; | 1558 | goto bad_packet; |
1559 | } | ||
1560 | if (tcp_checksum_complete(skb)) { | ||
1561 | inet_twsk_put(inet_twsk(sk)); | ||
1562 | goto csum_error; | ||
1562 | } | 1563 | } |
1563 | 1564 | ||
1564 | switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) { | 1565 | switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) { |