-
-struct netstat_columns {
- char *name;
- uint32_t hash;
- unsigned long long value;
- int multiplier; // not needed everywhere
- char *label; // not needed everywhere
-};
-
-static struct netstat_columns tcpext_data[] = {
- { "SyncookiesSent", 0, 0, 1, NULL },
- { "SyncookiesRecv", 0, 0, 1, NULL },
- { "SyncookiesFailed", 0, 0, 1, NULL },
- { "EmbryonicRsts", 0, 0, 1, NULL },
- { "PruneCalled", 0, 0, 1, NULL },
- { "RcvPruned", 0, 0, 1, NULL },
- { "OfoPruned", 0, 0, 1, NULL },
- { "OutOfWindowIcmps", 0, 0, 1, NULL },
- { "LockDroppedIcmps", 0, 0, 1, NULL },
- { "ArpFilter", 0, 0, 1, NULL },
- { "TW", 0, 0, 1, NULL },
- { "TWRecycled", 0, 0, 1, NULL },
- { "TWKilled", 0, 0, 1, NULL },
- { "PAWSPassive", 0, 0, 1, NULL },
- { "PAWSActive", 0, 0, 1, NULL },
- { "PAWSEstab", 0, 0, 1, NULL },
- { "DelayedACKs", 0, 0, 1, NULL },
- { "DelayedACKLocked", 0, 0, 1, NULL },
- { "DelayedACKLost", 0, 0, 1, NULL },
- { "ListenOverflows", 0, 0, 1, NULL },
- { "ListenDrops", 0, 0, 1, NULL },
- { "TCPPrequeued", 0, 0, 1, NULL },
- { "TCPDirectCopyFromBacklog", 0, 0, 1, NULL },
- { "TCPDirectCopyFromPrequeue", 0, 0, 1, NULL },
- { "TCPPrequeueDropped", 0, 0, 1, NULL },
- { "TCPHPHits", 0, 0, 1, NULL },
- { "TCPHPHitsToUser", 0, 0, 1, NULL },
- { "TCPPureAcks", 0, 0, 1, NULL },
- { "TCPHPAcks", 0, 0, 1, NULL },
- { "TCPRenoRecovery", 0, 0, 1, NULL },
- { "TCPSackRecovery", 0, 0, 1, NULL },
- { "TCPSACKReneging", 0, 0, 1, NULL },
- { "TCPFACKReorder", 0, 0, 1, NULL },
- { "TCPSACKReorder", 0, 0, 1, NULL },
- { "TCPRenoReorder", 0, 0, 1, NULL },
- { "TCPTSReorder", 0, 0, 1, NULL },
- { "TCPFullUndo", 0, 0, 1, NULL },
- { "TCPPartialUndo", 0, 0, 1, NULL },
- { "TCPDSACKUndo", 0, 0, 1, NULL },
- { "TCPLossUndo", 0, 0, 1, NULL },
- { "TCPLostRetransmit", 0, 0, 1, NULL },
- { "TCPRenoFailures", 0, 0, 1, NULL },
- { "TCPSackFailures", 0, 0, 1, NULL },
- { "TCPLossFailures", 0, 0, 1, NULL },
- { "TCPFastRetrans", 0, 0, 1, NULL },
- { "TCPForwardRetrans", 0, 0, 1, NULL },
- { "TCPSlowStartRetrans", 0, 0, 1, NULL },
- { "TCPTimeouts", 0, 0, 1, NULL },
- { "TCPLossProbes", 0, 0, 1, NULL },
- { "TCPLossProbeRecovery", 0, 0, 1, NULL },
- { "TCPRenoRecoveryFail", 0, 0, 1, NULL },
- { "TCPSackRecoveryFail", 0, 0, 1, NULL },
- { "TCPSchedulerFailed", 0, 0, 1, NULL },
- { "TCPRcvCollapsed", 0, 0, 1, NULL },
- { "TCPDSACKOldSent", 0, 0, 1, NULL },
- { "TCPDSACKOfoSent", 0, 0, 1, NULL },
- { "TCPDSACKRecv", 0, 0, 1, NULL },
- { "TCPDSACKOfoRecv", 0, 0, 1, NULL },
- { "TCPAbortOnData", 0, 0, 1, NULL },
- { "TCPAbortOnClose", 0, 0, 1, NULL },
- { "TCPAbortOnMemory", 0, 0, 1, NULL },
- { "TCPAbortOnTimeout", 0, 0, 1, NULL },
- { "TCPAbortOnLinger", 0, 0, 1, NULL },
- { "TCPAbortFailed", 0, 0, 1, NULL },
- { "TCPMemoryPressures", 0, 0, 1, NULL },
- { "TCPSACKDiscard", 0, 0, 1, NULL },
- { "TCPDSACKIgnoredOld", 0, 0, 1, NULL },
- { "TCPDSACKIgnoredNoUndo", 0, 0, 1, NULL },
- { "TCPSpuriousRTOs", 0, 0, 1, NULL },
- { "TCPMD5NotFound", 0, 0, 1, NULL },
- { "TCPMD5Unexpected", 0, 0, 1, NULL },
- { "TCPSackShifted", 0, 0, 1, NULL },
- { "TCPSackMerged", 0, 0, 1, NULL },
- { "TCPSackShiftFallback", 0, 0, 1, NULL },
- { "TCPBacklogDrop", 0, 0, 1, NULL },
- { "TCPMinTTLDrop", 0, 0, 1, NULL },
- { "TCPDeferAcceptDrop", 0, 0, 1, NULL },
- { "IPReversePathFilter", 0, 0, 1, NULL },
- { "TCPTimeWaitOverflow", 0, 0, 1, NULL },
- { "TCPReqQFullDoCookies", 0, 0, 1, NULL },
- { "TCPReqQFullDrop", 0, 0, 1, NULL },
- { "TCPRetransFail", 0, 0, 1, NULL },
- { "TCPRcvCoalesce", 0, 0, 1, NULL },
- { "TCPOFOQueue", 0, 0, 1, NULL },
- { "TCPOFODrop", 0, 0, 1, NULL },
- { "TCPOFOMerge", 0, 0, 1, NULL },
- { "TCPChallengeACK", 0, 0, 1, NULL },
- { "TCPSYNChallenge", 0, 0, 1, NULL },
- { "TCPFastOpenActive", 0, 0, 1, NULL },
- { "TCPFastOpenActiveFail", 0, 0, 1, NULL },
- { "TCPFastOpenPassive", 0, 0, 1, NULL },
- { "TCPFastOpenPassiveFail", 0, 0, 1, NULL },
- { "TCPFastOpenListenOverflow", 0, 0, 1, NULL },
- { "TCPFastOpenCookieReqd", 0, 0, 1, NULL },
- { "TCPSpuriousRtxHostQueues", 0, 0, 1, NULL },
- { "BusyPollRxPackets", 0, 0, 1, NULL },
- { "TCPAutoCorking", 0, 0, 1, NULL },
- { "TCPFromZeroWindowAdv", 0, 0, 1, NULL },
- { "TCPToZeroWindowAdv", 0, 0, 1, NULL },
- { "TCPWantZeroWindowAdv", 0, 0, 1, NULL },
- { "TCPSynRetrans", 0, 0, 1, NULL },
- { "TCPOrigDataSent", 0, 0, 1, NULL },
- { "TCPHystartTrainDetect", 0, 0, 1, NULL },
- { "TCPHystartTrainCwnd", 0, 0, 1, NULL },
- { "TCPHystartDelayDetect", 0, 0, 1, NULL },
- { "TCPHystartDelayCwnd", 0, 0, 1, NULL },
- { "TCPACKSkippedSynRecv", 0, 0, 1, NULL },
- { "TCPACKSkippedPAWS", 0, 0, 1, NULL },
- { "TCPACKSkippedSeq", 0, 0, 1, NULL },
- { "TCPACKSkippedFinWait2", 0, 0, 1, NULL },
- { "TCPACKSkippedTimeWait", 0, 0, 1, NULL },
- { "TCPACKSkippedChallenge", 0, 0, 1, NULL },
- { "TCPWinProbe", 0, 0, 1, NULL },
- { "TCPKeepAlive", 0, 0, 1, NULL },
- { "TCPMTUPFail", 0, 0, 1, NULL },
- { "TCPMTUPSuccess", 0, 0, 1, NULL },
- { NULL, 0, 0, 0, NULL }
-};
-
-static struct netstat_columns ipext_data[] = {
- { "InNoRoutes", 0, 0, 1, NULL },
- { "InTruncatedPkts", 0, 0, 1, NULL },
- { "InMcastPkts", 0, 0, 1, NULL },
- { "OutMcastPkts", 0, 0, 1, NULL },
- { "InBcastPkts", 0, 0, 1, NULL },
- { "OutBcastPkts", 0, 0, 1, NULL },
- { "InOctets", 0, 0, 1, NULL },
- { "OutOctets", 0, 0, 1, NULL },
- { "InMcastOctets", 0, 0, 1, NULL },
- { "OutMcastOctets", 0, 0, 1, NULL },
- { "InBcastOctets", 0, 0, 1, NULL },
- { "OutBcastOctets", 0, 0, 1, NULL },
- { "InCsumErrors", 0, 0, 1, NULL },
- { "InNoECTPkts", 0, 0, 1, NULL },
- { "InECT1Pkts", 0, 0, 1, NULL },
- { "InECT0Pkts", 0, 0, 1, NULL },
- { "InCEPkts", 0, 0, 1, NULL },
- { NULL, 0, 0, 0, NULL }
-};
-
-static void hash_array(struct netstat_columns *nc) {
- int i;
-
- for(i = 0; nc[i].name ;i++)
- nc[i].hash = simple_hash(nc[i].name);
-}
-
-static unsigned long long *netstat_columns_find(struct netstat_columns *nc, const char *name) {
- uint32_t i, hash = simple_hash(name);
-
- for(i = 0; nc[i].name ;i++)
- if(unlikely(nc[i].hash == hash && !strcmp(nc[i].name, name)))
- return &nc[i].value;
-
- fatal("Cannot find key '%s' in /proc/net/netstat internal array.", name);
-}
-
-static void parse_line_pair(procfile *ff, struct netstat_columns *nc, uint32_t header_line, uint32_t values_line) {
- uint32_t hwords = procfile_linewords(ff, header_line);
- uint32_t vwords = procfile_linewords(ff, values_line);
- uint32_t w, i;