LCOV - code coverage report
Current view: top level - net/ipv4 - proc.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 6 173 3.5 %
Date: 2021-04-22 12:43:58 Functions: 2 11 18.2 %

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

Generated by: LCOV version 1.14