root/net/ipv4/proc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. sockstat_seq_show
  2. icmpmsg_put_line
  3. icmpmsg_put
  4. icmp_put
  5. snmp_seq_show_ipstats
  6. snmp_seq_show_tcp_udp
  7. snmp_seq_show
  8. netstat_seq_show
  9. ip_proc_init_net
  10. ip_proc_exit_net
  11. ip_misc_proc_init

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * INET         An implementation of the TCP/IP protocol suite for the LINUX
   4  *              operating system.  INET is implemented using the  BSD Socket
   5  *              interface as the means of communication with the user level.
   6  *
   7  *              This file implements the various access functions for the
   8  *              PROC file system.  It is mainly used for debugging and
   9  *              statistics.
  10  *
  11  * Authors:     Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12  *              Gerald J. Heim, <heim@peanuts.informatik.uni-tuebingen.de>
  13  *              Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de>
  14  *              Erik Schoenfelder, <schoenfr@ibr.cs.tu-bs.de>
  15  *
  16  * Fixes:
  17  *              Alan Cox        :       UDP sockets show the rxqueue/txqueue
  18  *                                      using hint flag for the netinfo.
  19  *      Pauline Middelink       :       identd support
  20  *              Alan Cox        :       Make /proc safer.
  21  *      Erik Schoenfelder       :       /proc/net/snmp
  22  *              Alan Cox        :       Handle dead sockets properly.
  23  *      Gerhard Koerting        :       Show both timers
  24  *              Alan Cox        :       Allow inode to be NULL (kernel socket)
  25  *      Andi Kleen              :       Add support for open_requests and
  26  *                                      split functions for more readibility.
  27  *      Andi Kleen              :       Add support for /proc/net/netstat
  28  *      Arnaldo C. Melo         :       Convert to seq_file
  29  */
  30 #include <linux/types.h>
  31 #include <net/net_namespace.h>
  32 #include <net/icmp.h>
  33 #include <net/protocol.h>
  34 #include <net/tcp.h>
  35 #include <net/udp.h>
  36 #include <net/udplite.h>
  37 #include <linux/bottom_half.h>
  38 #include <linux/inetdevice.h>
  39 #include <linux/proc_fs.h>
  40 #include <linux/seq_file.h>
  41 #include <linux/export.h>
  42 #include <net/sock.h>
  43 #include <net/raw.h>
  44 
  45 #define TCPUDP_MIB_MAX max_t(u32, UDP_MIB_MAX, TCP_MIB_MAX)
  46 
  47 /*
  48  *      Report socket allocation statistics [mea@utu.fi]
  49  */
  50 static int sockstat_seq_show(struct seq_file *seq, void *v)
  51 {
  52         struct net *net = seq->private;
  53         int orphans, sockets;
  54 
  55         orphans = percpu_counter_sum_positive(&tcp_orphan_count);
  56         sockets = proto_sockets_allocated_sum_positive(&tcp_prot);
  57 
  58         socket_seq_show(seq);
  59         seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %ld\n",
  60                    sock_prot_inuse_get(net, &tcp_prot), orphans,
  61                    atomic_read(&net->ipv4.tcp_death_row.tw_count), sockets,
  62                    proto_memory_allocated(&tcp_prot));
  63         seq_printf(seq, "UDP: inuse %d mem %ld\n",
  64                    sock_prot_inuse_get(net, &udp_prot),
  65                    proto_memory_allocated(&udp_prot));
  66         seq_printf(seq, "UDPLITE: inuse %d\n",
  67                    sock_prot_inuse_get(net, &udplite_prot));
  68         seq_printf(seq, "RAW: inuse %d\n",
  69                    sock_prot_inuse_get(net, &raw_prot));
  70         seq_printf(seq,  "FRAG: inuse %u memory %lu\n",
  71                    atomic_read(&net->ipv4.fqdir->rhashtable.nelems),
  72                    frag_mem_limit(net->ipv4.fqdir));
  73         return 0;
  74 }
  75 
  76 /* snmp items */
  77 static const struct snmp_mib snmp4_ipstats_list[] = {
  78         SNMP_MIB_ITEM("InReceives", IPSTATS_MIB_INPKTS),
  79         SNMP_MIB_ITEM("InHdrErrors", IPSTATS_MIB_INHDRERRORS),
  80         SNMP_MIB_ITEM("InAddrErrors", IPSTATS_MIB_INADDRERRORS),
  81         SNMP_MIB_ITEM("ForwDatagrams", IPSTATS_MIB_OUTFORWDATAGRAMS),
  82         SNMP_MIB_ITEM("InUnknownProtos", IPSTATS_MIB_INUNKNOWNPROTOS),
  83         SNMP_MIB_ITEM("InDiscards", IPSTATS_MIB_INDISCARDS),
  84         SNMP_MIB_ITEM("InDelivers", IPSTATS_MIB_INDELIVERS),
  85         SNMP_MIB_ITEM("OutRequests", IPSTATS_MIB_OUTPKTS),
  86         SNMP_MIB_ITEM("OutDiscards", IPSTATS_MIB_OUTDISCARDS),
  87         SNMP_MIB_ITEM("OutNoRoutes", IPSTATS_MIB_OUTNOROUTES),
  88         SNMP_MIB_ITEM("ReasmTimeout", IPSTATS_MIB_REASMTIMEOUT),
  89         SNMP_MIB_ITEM("ReasmReqds", IPSTATS_MIB_REASMREQDS),
  90         SNMP_MIB_ITEM("ReasmOKs", IPSTATS_MIB_REASMOKS),
  91         SNMP_MIB_ITEM("ReasmFails", IPSTATS_MIB_REASMFAILS),
  92         SNMP_MIB_ITEM("FragOKs", IPSTATS_MIB_FRAGOKS),
  93         SNMP_MIB_ITEM("FragFails", IPSTATS_MIB_FRAGFAILS),
  94         SNMP_MIB_ITEM("FragCreates", IPSTATS_MIB_FRAGCREATES),
  95         SNMP_MIB_SENTINEL
  96 };
  97 
  98 /* Following items are displayed in /proc/net/netstat */
  99 static const struct snmp_mib snmp4_ipextstats_list[] = {
 100         SNMP_MIB_ITEM("InNoRoutes", IPSTATS_MIB_INNOROUTES),
 101         SNMP_MIB_ITEM("InTruncatedPkts", IPSTATS_MIB_INTRUNCATEDPKTS),
 102         SNMP_MIB_ITEM("InMcastPkts", IPSTATS_MIB_INMCASTPKTS),
 103         SNMP_MIB_ITEM("OutMcastPkts", IPSTATS_MIB_OUTMCASTPKTS),
 104         SNMP_MIB_ITEM("InBcastPkts", IPSTATS_MIB_INBCASTPKTS),
 105         SNMP_MIB_ITEM("OutBcastPkts", IPSTATS_MIB_OUTBCASTPKTS),
 106         SNMP_MIB_ITEM("InOctets", IPSTATS_MIB_INOCTETS),
 107         SNMP_MIB_ITEM("OutOctets", IPSTATS_MIB_OUTOCTETS),
 108         SNMP_MIB_ITEM("InMcastOctets", IPSTATS_MIB_INMCASTOCTETS),
 109         SNMP_MIB_ITEM("OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS),
 110         SNMP_MIB_ITEM("InBcastOctets", IPSTATS_MIB_INBCASTOCTETS),
 111         SNMP_MIB_ITEM("OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS),
 112         /* Non RFC4293 fields */
 113         SNMP_MIB_ITEM("InCsumErrors", IPSTATS_MIB_CSUMERRORS),
 114         SNMP_MIB_ITEM("InNoECTPkts", IPSTATS_MIB_NOECTPKTS),
 115         SNMP_MIB_ITEM("InECT1Pkts", IPSTATS_MIB_ECT1PKTS),
 116         SNMP_MIB_ITEM("InECT0Pkts", IPSTATS_MIB_ECT0PKTS),
 117         SNMP_MIB_ITEM("InCEPkts", IPSTATS_MIB_CEPKTS),
 118         SNMP_MIB_ITEM("ReasmOverlaps", IPSTATS_MIB_REASM_OVERLAPS),
 119         SNMP_MIB_SENTINEL
 120 };
 121 
 122 static const struct {
 123         const char *name;
 124         int index;
 125 } icmpmibmap[] = {
 126         { "DestUnreachs", ICMP_DEST_UNREACH },
 127         { "TimeExcds", ICMP_TIME_EXCEEDED },
 128         { "ParmProbs", ICMP_PARAMETERPROB },
 129         { "SrcQuenchs", ICMP_SOURCE_QUENCH },
 130         { "Redirects", ICMP_REDIRECT },
 131         { "Echos", ICMP_ECHO },
 132         { "EchoReps", ICMP_ECHOREPLY },
 133         { "Timestamps", ICMP_TIMESTAMP },
 134         { "TimestampReps", ICMP_TIMESTAMPREPLY },
 135         { "AddrMasks", ICMP_ADDRESS },
 136         { "AddrMaskReps", ICMP_ADDRESSREPLY },
 137         { NULL, 0 }
 138 };
 139 
 140 
 141 static const struct snmp_mib snmp4_tcp_list[] = {
 142         SNMP_MIB_ITEM("RtoAlgorithm", TCP_MIB_RTOALGORITHM),
 143         SNMP_MIB_ITEM("RtoMin", TCP_MIB_RTOMIN),
 144         SNMP_MIB_ITEM("RtoMax", TCP_MIB_RTOMAX),
 145         SNMP_MIB_ITEM("MaxConn", TCP_MIB_MAXCONN),
 146         SNMP_MIB_ITEM("ActiveOpens", TCP_MIB_ACTIVEOPENS),
 147         SNMP_MIB_ITEM("PassiveOpens", TCP_MIB_PASSIVEOPENS),
 148         SNMP_MIB_ITEM("AttemptFails", TCP_MIB_ATTEMPTFAILS),
 149         SNMP_MIB_ITEM("EstabResets", TCP_MIB_ESTABRESETS),
 150         SNMP_MIB_ITEM("CurrEstab", TCP_MIB_CURRESTAB),
 151         SNMP_MIB_ITEM("InSegs", TCP_MIB_INSEGS),
 152         SNMP_MIB_ITEM("OutSegs", TCP_MIB_OUTSEGS),
 153         SNMP_MIB_ITEM("RetransSegs", TCP_MIB_RETRANSSEGS),
 154         SNMP_MIB_ITEM("InErrs", TCP_MIB_INERRS),
 155         SNMP_MIB_ITEM("OutRsts", TCP_MIB_OUTRSTS),
 156         SNMP_MIB_ITEM("InCsumErrors", TCP_MIB_CSUMERRORS),
 157         SNMP_MIB_SENTINEL
 158 };
 159 
 160 static const struct snmp_mib snmp4_udp_list[] = {
 161         SNMP_MIB_ITEM("InDatagrams", UDP_MIB_INDATAGRAMS),
 162         SNMP_MIB_ITEM("NoPorts", UDP_MIB_NOPORTS),
 163         SNMP_MIB_ITEM("InErrors", UDP_MIB_INERRORS),
 164         SNMP_MIB_ITEM("OutDatagrams", UDP_MIB_OUTDATAGRAMS),
 165         SNMP_MIB_ITEM("RcvbufErrors", UDP_MIB_RCVBUFERRORS),
 166         SNMP_MIB_ITEM("SndbufErrors", UDP_MIB_SNDBUFERRORS),
 167         SNMP_MIB_ITEM("InCsumErrors", UDP_MIB_CSUMERRORS),
 168         SNMP_MIB_ITEM("IgnoredMulti", UDP_MIB_IGNOREDMULTI),
 169         SNMP_MIB_SENTINEL
 170 };
 171 
 172 static const struct snmp_mib snmp4_net_list[] = {
 173         SNMP_MIB_ITEM("SyncookiesSent", LINUX_MIB_SYNCOOKIESSENT),
 174         SNMP_MIB_ITEM("SyncookiesRecv", LINUX_MIB_SYNCOOKIESRECV),
 175         SNMP_MIB_ITEM("SyncookiesFailed", LINUX_MIB_SYNCOOKIESFAILED),
 176         SNMP_MIB_ITEM("EmbryonicRsts", LINUX_MIB_EMBRYONICRSTS),
 177         SNMP_MIB_ITEM("PruneCalled", LINUX_MIB_PRUNECALLED),
 178         SNMP_MIB_ITEM("RcvPruned", LINUX_MIB_RCVPRUNED),
 179         SNMP_MIB_ITEM("OfoPruned", LINUX_MIB_OFOPRUNED),
 180         SNMP_MIB_ITEM("OutOfWindowIcmps", LINUX_MIB_OUTOFWINDOWICMPS),
 181         SNMP_MIB_ITEM("LockDroppedIcmps", LINUX_MIB_LOCKDROPPEDICMPS),
 182         SNMP_MIB_ITEM("ArpFilter", LINUX_MIB_ARPFILTER),
 183         SNMP_MIB_ITEM("TW", LINUX_MIB_TIMEWAITED),
 184         SNMP_MIB_ITEM("TWRecycled", LINUX_MIB_TIMEWAITRECYCLED),
 185         SNMP_MIB_ITEM("TWKilled", LINUX_MIB_TIMEWAITKILLED),
 186         SNMP_MIB_ITEM("PAWSActive", LINUX_MIB_PAWSACTIVEREJECTED),
 187         SNMP_MIB_ITEM("PAWSEstab", LINUX_MIB_PAWSESTABREJECTED),
 188         SNMP_MIB_ITEM("DelayedACKs", LINUX_MIB_DELAYEDACKS),
 189         SNMP_MIB_ITEM("DelayedACKLocked", LINUX_MIB_DELAYEDACKLOCKED),
 190         SNMP_MIB_ITEM("DelayedACKLost", LINUX_MIB_DELAYEDACKLOST),
 191         SNMP_MIB_ITEM("ListenOverflows", LINUX_MIB_LISTENOVERFLOWS),
 192         SNMP_MIB_ITEM("ListenDrops", LINUX_MIB_LISTENDROPS),
 193         SNMP_MIB_ITEM("TCPHPHits", LINUX_MIB_TCPHPHITS),
 194         SNMP_MIB_ITEM("TCPPureAcks", LINUX_MIB_TCPPUREACKS),
 195         SNMP_MIB_ITEM("TCPHPAcks", LINUX_MIB_TCPHPACKS),
 196         SNMP_MIB_ITEM("TCPRenoRecovery", LINUX_MIB_TCPRENORECOVERY),
 197         SNMP_MIB_ITEM("TCPSackRecovery", LINUX_MIB_TCPSACKRECOVERY),
 198         SNMP_MIB_ITEM("TCPSACKReneging", LINUX_MIB_TCPSACKRENEGING),
 199         SNMP_MIB_ITEM("TCPSACKReorder", LINUX_MIB_TCPSACKREORDER),
 200         SNMP_MIB_ITEM("TCPRenoReorder", LINUX_MIB_TCPRENOREORDER),
 201         SNMP_MIB_ITEM("TCPTSReorder", LINUX_MIB_TCPTSREORDER),
 202         SNMP_MIB_ITEM("TCPFullUndo", LINUX_MIB_TCPFULLUNDO),
 203         SNMP_MIB_ITEM("TCPPartialUndo", LINUX_MIB_TCPPARTIALUNDO),
 204         SNMP_MIB_ITEM("TCPDSACKUndo", LINUX_MIB_TCPDSACKUNDO),
 205         SNMP_MIB_ITEM("TCPLossUndo", LINUX_MIB_TCPLOSSUNDO),
 206         SNMP_MIB_ITEM("TCPLostRetransmit", LINUX_MIB_TCPLOSTRETRANSMIT),
 207         SNMP_MIB_ITEM("TCPRenoFailures", LINUX_MIB_TCPRENOFAILURES),
 208         SNMP_MIB_ITEM("TCPSackFailures", LINUX_MIB_TCPSACKFAILURES),
 209         SNMP_MIB_ITEM("TCPLossFailures", LINUX_MIB_TCPLOSSFAILURES),
 210         SNMP_MIB_ITEM("TCPFastRetrans", LINUX_MIB_TCPFASTRETRANS),
 211         SNMP_MIB_ITEM("TCPSlowStartRetrans", LINUX_MIB_TCPSLOWSTARTRETRANS),
 212         SNMP_MIB_ITEM("TCPTimeouts", LINUX_MIB_TCPTIMEOUTS),
 213         SNMP_MIB_ITEM("TCPLossProbes", LINUX_MIB_TCPLOSSPROBES),
 214         SNMP_MIB_ITEM("TCPLossProbeRecovery", LINUX_MIB_TCPLOSSPROBERECOVERY),
 215         SNMP_MIB_ITEM("TCPRenoRecoveryFail", LINUX_MIB_TCPRENORECOVERYFAIL),
 216         SNMP_MIB_ITEM("TCPSackRecoveryFail", LINUX_MIB_TCPSACKRECOVERYFAIL),
 217         SNMP_MIB_ITEM("TCPRcvCollapsed", LINUX_MIB_TCPRCVCOLLAPSED),
 218         SNMP_MIB_ITEM("TCPBacklogCoalesce", LINUX_MIB_TCPBACKLOGCOALESCE),
 219         SNMP_MIB_ITEM("TCPDSACKOldSent", LINUX_MIB_TCPDSACKOLDSENT),
 220         SNMP_MIB_ITEM("TCPDSACKOfoSent", LINUX_MIB_TCPDSACKOFOSENT),
 221         SNMP_MIB_ITEM("TCPDSACKRecv", LINUX_MIB_TCPDSACKRECV),
 222         SNMP_MIB_ITEM("TCPDSACKOfoRecv", LINUX_MIB_TCPDSACKOFORECV),
 223         SNMP_MIB_ITEM("TCPAbortOnData", LINUX_MIB_TCPABORTONDATA),
 224         SNMP_MIB_ITEM("TCPAbortOnClose", LINUX_MIB_TCPABORTONCLOSE),
 225         SNMP_MIB_ITEM("TCPAbortOnMemory", LINUX_MIB_TCPABORTONMEMORY),
 226         SNMP_MIB_ITEM("TCPAbortOnTimeout", LINUX_MIB_TCPABORTONTIMEOUT),
 227         SNMP_MIB_ITEM("TCPAbortOnLinger", LINUX_MIB_TCPABORTONLINGER),
 228         SNMP_MIB_ITEM("TCPAbortFailed", LINUX_MIB_TCPABORTFAILED),
 229         SNMP_MIB_ITEM("TCPMemoryPressures", LINUX_MIB_TCPMEMORYPRESSURES),
 230         SNMP_MIB_ITEM("TCPMemoryPressuresChrono", LINUX_MIB_TCPMEMORYPRESSURESCHRONO),
 231         SNMP_MIB_ITEM("TCPSACKDiscard", LINUX_MIB_TCPSACKDISCARD),
 232         SNMP_MIB_ITEM("TCPDSACKIgnoredOld", LINUX_MIB_TCPDSACKIGNOREDOLD),
 233         SNMP_MIB_ITEM("TCPDSACKIgnoredNoUndo", LINUX_MIB_TCPDSACKIGNOREDNOUNDO),
 234         SNMP_MIB_ITEM("TCPSpuriousRTOs", LINUX_MIB_TCPSPURIOUSRTOS),
 235         SNMP_MIB_ITEM("TCPMD5NotFound", LINUX_MIB_TCPMD5NOTFOUND),
 236         SNMP_MIB_ITEM("TCPMD5Unexpected", LINUX_MIB_TCPMD5UNEXPECTED),
 237         SNMP_MIB_ITEM("TCPMD5Failure", LINUX_MIB_TCPMD5FAILURE),
 238         SNMP_MIB_ITEM("TCPSackShifted", LINUX_MIB_SACKSHIFTED),
 239         SNMP_MIB_ITEM("TCPSackMerged", LINUX_MIB_SACKMERGED),
 240         SNMP_MIB_ITEM("TCPSackShiftFallback", LINUX_MIB_SACKSHIFTFALLBACK),
 241         SNMP_MIB_ITEM("TCPBacklogDrop", LINUX_MIB_TCPBACKLOGDROP),
 242         SNMP_MIB_ITEM("PFMemallocDrop", LINUX_MIB_PFMEMALLOCDROP),
 243         SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP),
 244         SNMP_MIB_ITEM("TCPDeferAcceptDrop", LINUX_MIB_TCPDEFERACCEPTDROP),
 245         SNMP_MIB_ITEM("IPReversePathFilter", LINUX_MIB_IPRPFILTER),
 246         SNMP_MIB_ITEM("TCPTimeWaitOverflow", LINUX_MIB_TCPTIMEWAITOVERFLOW),
 247         SNMP_MIB_ITEM("TCPReqQFullDoCookies", LINUX_MIB_TCPREQQFULLDOCOOKIES),
 248         SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP),
 249         SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL),
 250         SNMP_MIB_ITEM("TCPRcvCoalesce", LINUX_MIB_TCPRCVCOALESCE),
 251         SNMP_MIB_ITEM("TCPOFOQueue", LINUX_MIB_TCPOFOQUEUE),
 252         SNMP_MIB_ITEM("TCPOFODrop", LINUX_MIB_TCPOFODROP),
 253         SNMP_MIB_ITEM("TCPOFOMerge", LINUX_MIB_TCPOFOMERGE),
 254         SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK),
 255         SNMP_MIB_ITEM("TCPSYNChallenge", LINUX_MIB_TCPSYNCHALLENGE),
 256         SNMP_MIB_ITEM("TCPFastOpenActive", LINUX_MIB_TCPFASTOPENACTIVE),
 257         SNMP_MIB_ITEM("TCPFastOpenActiveFail", LINUX_MIB_TCPFASTOPENACTIVEFAIL),
 258         SNMP_MIB_ITEM("TCPFastOpenPassive", LINUX_MIB_TCPFASTOPENPASSIVE),
 259         SNMP_MIB_ITEM("TCPFastOpenPassiveFail", LINUX_MIB_TCPFASTOPENPASSIVEFAIL),
 260         SNMP_MIB_ITEM("TCPFastOpenListenOverflow", LINUX_MIB_TCPFASTOPENLISTENOVERFLOW),
 261         SNMP_MIB_ITEM("TCPFastOpenCookieReqd", LINUX_MIB_TCPFASTOPENCOOKIEREQD),
 262         SNMP_MIB_ITEM("TCPFastOpenBlackhole", LINUX_MIB_TCPFASTOPENBLACKHOLE),
 263         SNMP_MIB_ITEM("TCPSpuriousRtxHostQueues", LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES),
 264         SNMP_MIB_ITEM("BusyPollRxPackets", LINUX_MIB_BUSYPOLLRXPACKETS),
 265         SNMP_MIB_ITEM("TCPAutoCorking", LINUX_MIB_TCPAUTOCORKING),
 266         SNMP_MIB_ITEM("TCPFromZeroWindowAdv", LINUX_MIB_TCPFROMZEROWINDOWADV),
 267         SNMP_MIB_ITEM("TCPToZeroWindowAdv", LINUX_MIB_TCPTOZEROWINDOWADV),
 268         SNMP_MIB_ITEM("TCPWantZeroWindowAdv", LINUX_MIB_TCPWANTZEROWINDOWADV),
 269         SNMP_MIB_ITEM("TCPSynRetrans", LINUX_MIB_TCPSYNRETRANS),
 270         SNMP_MIB_ITEM("TCPOrigDataSent", LINUX_MIB_TCPORIGDATASENT),
 271         SNMP_MIB_ITEM("TCPHystartTrainDetect", LINUX_MIB_TCPHYSTARTTRAINDETECT),
 272         SNMP_MIB_ITEM("TCPHystartTrainCwnd", LINUX_MIB_TCPHYSTARTTRAINCWND),
 273         SNMP_MIB_ITEM("TCPHystartDelayDetect", LINUX_MIB_TCPHYSTARTDELAYDETECT),
 274         SNMP_MIB_ITEM("TCPHystartDelayCwnd", LINUX_MIB_TCPHYSTARTDELAYCWND),
 275         SNMP_MIB_ITEM("TCPACKSkippedSynRecv", LINUX_MIB_TCPACKSKIPPEDSYNRECV),
 276         SNMP_MIB_ITEM("TCPACKSkippedPAWS", LINUX_MIB_TCPACKSKIPPEDPAWS),
 277         SNMP_MIB_ITEM("TCPACKSkippedSeq", LINUX_MIB_TCPACKSKIPPEDSEQ),
 278         SNMP_MIB_ITEM("TCPACKSkippedFinWait2", LINUX_MIB_TCPACKSKIPPEDFINWAIT2),
 279         SNMP_MIB_ITEM("TCPACKSkippedTimeWait", LINUX_MIB_TCPACKSKIPPEDTIMEWAIT),
 280         SNMP_MIB_ITEM("TCPACKSkippedChallenge", LINUX_MIB_TCPACKSKIPPEDCHALLENGE),
 281         SNMP_MIB_ITEM("TCPWinProbe", LINUX_MIB_TCPWINPROBE),
 282         SNMP_MIB_ITEM("TCPKeepAlive", LINUX_MIB_TCPKEEPALIVE),
 283         SNMP_MIB_ITEM("TCPMTUPFail", LINUX_MIB_TCPMTUPFAIL),
 284         SNMP_MIB_ITEM("TCPMTUPSuccess", LINUX_MIB_TCPMTUPSUCCESS),
 285         SNMP_MIB_ITEM("TCPDelivered", LINUX_MIB_TCPDELIVERED),
 286         SNMP_MIB_ITEM("TCPDeliveredCE", LINUX_MIB_TCPDELIVEREDCE),
 287         SNMP_MIB_ITEM("TCPAckCompressed", LINUX_MIB_TCPACKCOMPRESSED),
 288         SNMP_MIB_ITEM("TCPZeroWindowDrop", LINUX_MIB_TCPZEROWINDOWDROP),
 289         SNMP_MIB_ITEM("TCPRcvQDrop", LINUX_MIB_TCPRCVQDROP),
 290         SNMP_MIB_ITEM("TCPWqueueTooBig", LINUX_MIB_TCPWQUEUETOOBIG),
 291         SNMP_MIB_ITEM("TCPFastOpenPassiveAltKey", LINUX_MIB_TCPFASTOPENPASSIVEALTKEY),
 292         SNMP_MIB_SENTINEL
 293 };
 294 
 295 static void icmpmsg_put_line(struct seq_file *seq, unsigned long *vals,
 296                              unsigned short *type, int count)
 297 {
 298         int j;
 299 
 300         if (count) {
 301                 seq_puts(seq, "\nIcmpMsg:");
 302                 for (j = 0; j < count; ++j)
 303                         seq_printf(seq, " %sType%u",
 304                                 type[j] & 0x100 ? "Out" : "In",
 305                                 type[j] & 0xff);
 306                 seq_puts(seq, "\nIcmpMsg:");
 307                 for (j = 0; j < count; ++j)
 308                         seq_printf(seq, " %lu", vals[j]);
 309         }
 310 }
 311 
 312 static void icmpmsg_put(struct seq_file *seq)
 313 {
 314 #define PERLINE 16
 315 
 316         int i, count;
 317         unsigned short type[PERLINE];
 318         unsigned long vals[PERLINE], val;
 319         struct net *net = seq->private;
 320 
 321         count = 0;
 322         for (i = 0; i < ICMPMSG_MIB_MAX; i++) {
 323                 val = atomic_long_read(&net->mib.icmpmsg_statistics->mibs[i]);
 324                 if (val) {
 325                         type[count] = i;
 326                         vals[count++] = val;
 327                 }
 328                 if (count == PERLINE) {
 329                         icmpmsg_put_line(seq, vals, type, count);
 330                         count = 0;
 331                 }
 332         }
 333         icmpmsg_put_line(seq, vals, type, count);
 334 
 335 #undef PERLINE
 336 }
 337 
 338 static void icmp_put(struct seq_file *seq)
 339 {
 340         int i;
 341         struct net *net = seq->private;
 342         atomic_long_t *ptr = net->mib.icmpmsg_statistics->mibs;
 343 
 344         seq_puts(seq, "\nIcmp: InMsgs InErrors InCsumErrors");
 345         for (i = 0; icmpmibmap[i].name; i++)
 346                 seq_printf(seq, " In%s", icmpmibmap[i].name);
 347         seq_puts(seq, " OutMsgs OutErrors");
 348         for (i = 0; icmpmibmap[i].name; i++)
 349                 seq_printf(seq, " Out%s", icmpmibmap[i].name);
 350         seq_printf(seq, "\nIcmp: %lu %lu %lu",
 351                 snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_INMSGS),
 352                 snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_INERRORS),
 353                 snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_CSUMERRORS));
 354         for (i = 0; icmpmibmap[i].name; i++)
 355                 seq_printf(seq, " %lu",
 356                            atomic_long_read(ptr + icmpmibmap[i].index));
 357         seq_printf(seq, " %lu %lu",
 358                 snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_OUTMSGS),
 359                 snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_OUTERRORS));
 360         for (i = 0; icmpmibmap[i].name; i++)
 361                 seq_printf(seq, " %lu",
 362                            atomic_long_read(ptr + (icmpmibmap[i].index | 0x100)));
 363 }
 364 
 365 /*
 366  *      Called from the PROCfs module. This outputs /proc/net/snmp.
 367  */
 368 static int snmp_seq_show_ipstats(struct seq_file *seq, void *v)
 369 {
 370         struct net *net = seq->private;
 371         u64 buff64[IPSTATS_MIB_MAX];
 372         int i;
 373 
 374         memset(buff64, 0, IPSTATS_MIB_MAX * sizeof(u64));
 375 
 376         seq_puts(seq, "Ip: Forwarding DefaultTTL");
 377         for (i = 0; snmp4_ipstats_list[i].name; i++)
 378                 seq_printf(seq, " %s", snmp4_ipstats_list[i].name);
 379 
 380         seq_printf(seq, "\nIp: %d %d",
 381                    IPV4_DEVCONF_ALL(net, FORWARDING) ? 1 : 2,
 382                    net->ipv4.sysctl_ip_default_ttl);
 383 
 384         BUILD_BUG_ON(offsetof(struct ipstats_mib, mibs) != 0);
 385         snmp_get_cpu_field64_batch(buff64, snmp4_ipstats_list,
 386                                    net->mib.ip_statistics,
 387                                    offsetof(struct ipstats_mib, syncp));
 388         for (i = 0; snmp4_ipstats_list[i].name; i++)
 389                 seq_printf(seq, " %llu", buff64[i]);
 390 
 391         return 0;
 392 }
 393 
 394 static int snmp_seq_show_tcp_udp(struct seq_file *seq, void *v)
 395 {
 396         unsigned long buff[TCPUDP_MIB_MAX];
 397         struct net *net = seq->private;
 398         int i;
 399 
 400         memset(buff, 0, TCPUDP_MIB_MAX * sizeof(unsigned long));
 401 
 402         seq_puts(seq, "\nTcp:");
 403         for (i = 0; snmp4_tcp_list[i].name; i++)
 404                 seq_printf(seq, " %s", snmp4_tcp_list[i].name);
 405 
 406         seq_puts(seq, "\nTcp:");
 407         snmp_get_cpu_field_batch(buff, snmp4_tcp_list,
 408                                  net->mib.tcp_statistics);
 409         for (i = 0; snmp4_tcp_list[i].name; i++) {
 410                 /* MaxConn field is signed, RFC 2012 */
 411                 if (snmp4_tcp_list[i].entry == TCP_MIB_MAXCONN)
 412                         seq_printf(seq, " %ld", buff[i]);
 413                 else
 414                         seq_printf(seq, " %lu", buff[i]);
 415         }
 416 
 417         memset(buff, 0, TCPUDP_MIB_MAX * sizeof(unsigned long));
 418 
 419         snmp_get_cpu_field_batch(buff, snmp4_udp_list,
 420                                  net->mib.udp_statistics);
 421         seq_puts(seq, "\nUdp:");
 422         for (i = 0; snmp4_udp_list[i].name; i++)
 423                 seq_printf(seq, " %s", snmp4_udp_list[i].name);
 424         seq_puts(seq, "\nUdp:");
 425         for (i = 0; snmp4_udp_list[i].name; i++)
 426                 seq_printf(seq, " %lu", buff[i]);
 427 
 428         memset(buff, 0, TCPUDP_MIB_MAX * sizeof(unsigned long));
 429 
 430         /* the UDP and UDP-Lite MIBs are the same */
 431         seq_puts(seq, "\nUdpLite:");
 432         snmp_get_cpu_field_batch(buff, snmp4_udp_list,
 433                                  net->mib.udplite_statistics);
 434         for (i = 0; snmp4_udp_list[i].name; i++)
 435                 seq_printf(seq, " %s", snmp4_udp_list[i].name);
 436         seq_puts(seq, "\nUdpLite:");
 437         for (i = 0; snmp4_udp_list[i].name; i++)
 438                 seq_printf(seq, " %lu", buff[i]);
 439 
 440         seq_putc(seq, '\n');
 441         return 0;
 442 }
 443 
 444 static int snmp_seq_show(struct seq_file *seq, void *v)
 445 {
 446         snmp_seq_show_ipstats(seq, v);
 447 
 448         icmp_put(seq);  /* RFC 2011 compatibility */
 449         icmpmsg_put(seq);
 450 
 451         snmp_seq_show_tcp_udp(seq, v);
 452 
 453         return 0;
 454 }
 455 
 456 /*
 457  *      Output /proc/net/netstat
 458  */
 459 static int netstat_seq_show(struct seq_file *seq, void *v)
 460 {
 461         int i;
 462         struct net *net = seq->private;
 463 
 464         seq_puts(seq, "TcpExt:");
 465         for (i = 0; snmp4_net_list[i].name; i++)
 466                 seq_printf(seq, " %s", snmp4_net_list[i].name);
 467 
 468         seq_puts(seq, "\nTcpExt:");
 469         for (i = 0; snmp4_net_list[i].name; i++)
 470                 seq_printf(seq, " %lu",
 471                            snmp_fold_field(net->mib.net_statistics,
 472                                            snmp4_net_list[i].entry));
 473 
 474         seq_puts(seq, "\nIpExt:");
 475         for (i = 0; snmp4_ipextstats_list[i].name; i++)
 476                 seq_printf(seq, " %s", snmp4_ipextstats_list[i].name);
 477 
 478         seq_puts(seq, "\nIpExt:");
 479         for (i = 0; snmp4_ipextstats_list[i].name; i++)
 480                 seq_printf(seq, " %llu",
 481                            snmp_fold_field64(net->mib.ip_statistics,
 482                                              snmp4_ipextstats_list[i].entry,
 483                                              offsetof(struct ipstats_mib, syncp)));
 484 
 485         seq_putc(seq, '\n');
 486         return 0;
 487 }
 488 
 489 static __net_init int ip_proc_init_net(struct net *net)
 490 {
 491         if (!proc_create_net_single("sockstat", 0444, net->proc_net,
 492                         sockstat_seq_show, NULL))
 493                 goto out_sockstat;
 494         if (!proc_create_net_single("netstat", 0444, net->proc_net,
 495                         netstat_seq_show, NULL))
 496                 goto out_netstat;
 497         if (!proc_create_net_single("snmp", 0444, net->proc_net, snmp_seq_show,
 498                         NULL))
 499                 goto out_snmp;
 500 
 501         return 0;
 502 
 503 out_snmp:
 504         remove_proc_entry("netstat", net->proc_net);
 505 out_netstat:
 506         remove_proc_entry("sockstat", net->proc_net);
 507 out_sockstat:
 508         return -ENOMEM;
 509 }
 510 
 511 static __net_exit void ip_proc_exit_net(struct net *net)
 512 {
 513         remove_proc_entry("snmp", net->proc_net);
 514         remove_proc_entry("netstat", net->proc_net);
 515         remove_proc_entry("sockstat", net->proc_net);
 516 }
 517 
 518 static __net_initdata struct pernet_operations ip_proc_ops = {
 519         .init = ip_proc_init_net,
 520         .exit = ip_proc_exit_net,
 521 };
 522 
 523 int __init ip_misc_proc_init(void)
 524 {
 525         return register_pernet_subsys(&ip_proc_ops);
 526 }

/* [<][>][^][v][top][bottom][index][help] */