]> err.no Git - linux-2.6/commitdiff
[TCP] MIB: Add counters for discarded SACK blocks
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>
Sat, 25 Aug 2007 05:55:52 +0000 (22:55 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 10 Oct 2007 23:48:30 +0000 (16:48 -0700)
In DSACK case, some events are not extraordinary, such as packet
duplication generated DSACK. They can arrive easily below
snd_una when undo_marker is not set (TCP being in CA_Open),
counting such DSACKs amoung SACK discards will likely just
mislead if they occur in some scenario when there are other
problems as well. Similarly, excessively delayed packets could
cause "normal" DSACKs. Therefore, separate counters are
allocated for DSACK events.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/snmp.h
net/ipv4/proc.c
net/ipv4/tcp_input.c

index 802b3a38b0416e3f00d8057eb6182307e0a74be4..d24c554738218495bb7a8f90fa9eaee8a6a3fcb1 100644 (file)
@@ -231,6 +231,9 @@ enum
        LINUX_MIB_TCPABORTONLINGER,             /* TCPAbortOnLinger */
        LINUX_MIB_TCPABORTFAILED,               /* TCPAbortFailed */
        LINUX_MIB_TCPMEMORYPRESSURES,           /* TCPMemoryPressures */
+       LINUX_MIB_TCPSACKDISCARD,               /* TCPSACKDiscard */
+       LINUX_MIB_TCPDSACKIGNOREDOLD,           /* TCPSACKIgnoredOld */
+       LINUX_MIB_TCPDSACKIGNOREDNOUNDO,        /* TCPSACKIgnoredNoUndo */
        __LINUX_MIB_MAX
 };
 
index 3b690cf2a4ee62263a16c11c6f69d861f42e1056..986d1c83a0005598098814c4c11fdb6a59918326 100644 (file)
@@ -244,6 +244,9 @@ static const struct snmp_mib snmp4_net_list[] = {
        SNMP_MIB_ITEM("TCPAbortOnLinger", LINUX_MIB_TCPABORTONLINGER),
        SNMP_MIB_ITEM("TCPAbortFailed", LINUX_MIB_TCPABORTFAILED),
        SNMP_MIB_ITEM("TCPMemoryPressures", LINUX_MIB_TCPMEMORYPRESSURES),
+       SNMP_MIB_ITEM("TCPSACKDiscard", LINUX_MIB_TCPSACKDISCARD),
+       SNMP_MIB_ITEM("TCPDSACKIgnoredOld", LINUX_MIB_TCPDSACKIGNOREDOLD),
+       SNMP_MIB_ITEM("TCPDSACKIgnoredNoUndo", LINUX_MIB_TCPDSACKIGNOREDNOUNDO),
        SNMP_MIB_SENTINEL
 };
 
index a2364ebf85852b6d8d7793cfb69dfefb2cca4d53..f9e4d7ad68b78a2e488871c0e439089f6ba79d1d 100644 (file)
@@ -1240,8 +1240,16 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
                int fack_count;
                int dup_sack = (found_dup_sack && (i == first_sack_index));
 
-               if (!tcp_is_sackblock_valid(tp, dup_sack, start_seq, end_seq))
+               if (!tcp_is_sackblock_valid(tp, dup_sack, start_seq, end_seq)) {
+                       if (dup_sack) {
+                               if (!tp->undo_marker)
+                                       NET_INC_STATS_BH(LINUX_MIB_TCPDSACKIGNOREDNOUNDO);
+                               else
+                                       NET_INC_STATS_BH(LINUX_MIB_TCPDSACKIGNOREDOLD);
+                       } else
+                               NET_INC_STATS_BH(LINUX_MIB_TCPSACKDISCARD);
                        continue;
+               }
 
                skb = cached_skb;
                fack_count = cached_fack_count;