162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * INET An implementation of the TCP/IP protocol suite for the LINUX 462306a36Sopenharmony_ci * operating system. INET is implemented using the BSD Socket 562306a36Sopenharmony_ci * interface as the means of communication with the user level. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This file implements the various access functions for the 862306a36Sopenharmony_ci * PROC file system. It is mainly used for debugging and 962306a36Sopenharmony_ci * statistics. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Authors: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 1262306a36Sopenharmony_ci * Gerald J. Heim, <heim@peanuts.informatik.uni-tuebingen.de> 1362306a36Sopenharmony_ci * Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de> 1462306a36Sopenharmony_ci * Erik Schoenfelder, <schoenfr@ibr.cs.tu-bs.de> 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * Fixes: 1762306a36Sopenharmony_ci * Alan Cox : UDP sockets show the rxqueue/txqueue 1862306a36Sopenharmony_ci * using hint flag for the netinfo. 1962306a36Sopenharmony_ci * Pauline Middelink : identd support 2062306a36Sopenharmony_ci * Alan Cox : Make /proc safer. 2162306a36Sopenharmony_ci * Erik Schoenfelder : /proc/net/snmp 2262306a36Sopenharmony_ci * Alan Cox : Handle dead sockets properly. 2362306a36Sopenharmony_ci * Gerhard Koerting : Show both timers 2462306a36Sopenharmony_ci * Alan Cox : Allow inode to be NULL (kernel socket) 2562306a36Sopenharmony_ci * Andi Kleen : Add support for open_requests and 2662306a36Sopenharmony_ci * split functions for more readibility. 2762306a36Sopenharmony_ci * Andi Kleen : Add support for /proc/net/netstat 2862306a36Sopenharmony_ci * Arnaldo C. Melo : Convert to seq_file 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci#include <linux/types.h> 3162306a36Sopenharmony_ci#include <net/net_namespace.h> 3262306a36Sopenharmony_ci#include <net/icmp.h> 3362306a36Sopenharmony_ci#include <net/protocol.h> 3462306a36Sopenharmony_ci#include <net/tcp.h> 3562306a36Sopenharmony_ci#include <net/mptcp.h> 3662306a36Sopenharmony_ci#include <net/udp.h> 3762306a36Sopenharmony_ci#include <net/udplite.h> 3862306a36Sopenharmony_ci#include <linux/bottom_half.h> 3962306a36Sopenharmony_ci#include <linux/inetdevice.h> 4062306a36Sopenharmony_ci#include <linux/proc_fs.h> 4162306a36Sopenharmony_ci#include <linux/seq_file.h> 4262306a36Sopenharmony_ci#include <linux/export.h> 4362306a36Sopenharmony_ci#include <net/sock.h> 4462306a36Sopenharmony_ci#include <net/raw.h> 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define TCPUDP_MIB_MAX max_t(u32, UDP_MIB_MAX, TCP_MIB_MAX) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* 4962306a36Sopenharmony_ci * Report socket allocation statistics [mea@utu.fi] 5062306a36Sopenharmony_ci */ 5162306a36Sopenharmony_cistatic int sockstat_seq_show(struct seq_file *seq, void *v) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci struct net *net = seq->private; 5462306a36Sopenharmony_ci int orphans, sockets; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci orphans = tcp_orphan_count_sum(); 5762306a36Sopenharmony_ci sockets = proto_sockets_allocated_sum_positive(&tcp_prot); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci socket_seq_show(seq); 6062306a36Sopenharmony_ci seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %ld\n", 6162306a36Sopenharmony_ci sock_prot_inuse_get(net, &tcp_prot), orphans, 6262306a36Sopenharmony_ci refcount_read(&net->ipv4.tcp_death_row.tw_refcount) - 1, 6362306a36Sopenharmony_ci sockets, proto_memory_allocated(&tcp_prot)); 6462306a36Sopenharmony_ci seq_printf(seq, "UDP: inuse %d mem %ld\n", 6562306a36Sopenharmony_ci sock_prot_inuse_get(net, &udp_prot), 6662306a36Sopenharmony_ci proto_memory_allocated(&udp_prot)); 6762306a36Sopenharmony_ci seq_printf(seq, "UDPLITE: inuse %d\n", 6862306a36Sopenharmony_ci sock_prot_inuse_get(net, &udplite_prot)); 6962306a36Sopenharmony_ci seq_printf(seq, "RAW: inuse %d\n", 7062306a36Sopenharmony_ci sock_prot_inuse_get(net, &raw_prot)); 7162306a36Sopenharmony_ci seq_printf(seq, "FRAG: inuse %u memory %lu\n", 7262306a36Sopenharmony_ci atomic_read(&net->ipv4.fqdir->rhashtable.nelems), 7362306a36Sopenharmony_ci frag_mem_limit(net->ipv4.fqdir)); 7462306a36Sopenharmony_ci return 0; 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* snmp items */ 7862306a36Sopenharmony_cistatic const struct snmp_mib snmp4_ipstats_list[] = { 7962306a36Sopenharmony_ci SNMP_MIB_ITEM("InReceives", IPSTATS_MIB_INPKTS), 8062306a36Sopenharmony_ci SNMP_MIB_ITEM("InHdrErrors", IPSTATS_MIB_INHDRERRORS), 8162306a36Sopenharmony_ci SNMP_MIB_ITEM("InAddrErrors", IPSTATS_MIB_INADDRERRORS), 8262306a36Sopenharmony_ci SNMP_MIB_ITEM("ForwDatagrams", IPSTATS_MIB_OUTFORWDATAGRAMS), 8362306a36Sopenharmony_ci SNMP_MIB_ITEM("InUnknownProtos", IPSTATS_MIB_INUNKNOWNPROTOS), 8462306a36Sopenharmony_ci SNMP_MIB_ITEM("InDiscards", IPSTATS_MIB_INDISCARDS), 8562306a36Sopenharmony_ci SNMP_MIB_ITEM("InDelivers", IPSTATS_MIB_INDELIVERS), 8662306a36Sopenharmony_ci SNMP_MIB_ITEM("OutRequests", IPSTATS_MIB_OUTPKTS), 8762306a36Sopenharmony_ci SNMP_MIB_ITEM("OutDiscards", IPSTATS_MIB_OUTDISCARDS), 8862306a36Sopenharmony_ci SNMP_MIB_ITEM("OutNoRoutes", IPSTATS_MIB_OUTNOROUTES), 8962306a36Sopenharmony_ci SNMP_MIB_ITEM("ReasmTimeout", IPSTATS_MIB_REASMTIMEOUT), 9062306a36Sopenharmony_ci SNMP_MIB_ITEM("ReasmReqds", IPSTATS_MIB_REASMREQDS), 9162306a36Sopenharmony_ci SNMP_MIB_ITEM("ReasmOKs", IPSTATS_MIB_REASMOKS), 9262306a36Sopenharmony_ci SNMP_MIB_ITEM("ReasmFails", IPSTATS_MIB_REASMFAILS), 9362306a36Sopenharmony_ci SNMP_MIB_ITEM("FragOKs", IPSTATS_MIB_FRAGOKS), 9462306a36Sopenharmony_ci SNMP_MIB_ITEM("FragFails", IPSTATS_MIB_FRAGFAILS), 9562306a36Sopenharmony_ci SNMP_MIB_ITEM("FragCreates", IPSTATS_MIB_FRAGCREATES), 9662306a36Sopenharmony_ci SNMP_MIB_SENTINEL 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* Following items are displayed in /proc/net/netstat */ 10062306a36Sopenharmony_cistatic const struct snmp_mib snmp4_ipextstats_list[] = { 10162306a36Sopenharmony_ci SNMP_MIB_ITEM("InNoRoutes", IPSTATS_MIB_INNOROUTES), 10262306a36Sopenharmony_ci SNMP_MIB_ITEM("InTruncatedPkts", IPSTATS_MIB_INTRUNCATEDPKTS), 10362306a36Sopenharmony_ci SNMP_MIB_ITEM("InMcastPkts", IPSTATS_MIB_INMCASTPKTS), 10462306a36Sopenharmony_ci SNMP_MIB_ITEM("OutMcastPkts", IPSTATS_MIB_OUTMCASTPKTS), 10562306a36Sopenharmony_ci SNMP_MIB_ITEM("InBcastPkts", IPSTATS_MIB_INBCASTPKTS), 10662306a36Sopenharmony_ci SNMP_MIB_ITEM("OutBcastPkts", IPSTATS_MIB_OUTBCASTPKTS), 10762306a36Sopenharmony_ci SNMP_MIB_ITEM("InOctets", IPSTATS_MIB_INOCTETS), 10862306a36Sopenharmony_ci SNMP_MIB_ITEM("OutOctets", IPSTATS_MIB_OUTOCTETS), 10962306a36Sopenharmony_ci SNMP_MIB_ITEM("InMcastOctets", IPSTATS_MIB_INMCASTOCTETS), 11062306a36Sopenharmony_ci SNMP_MIB_ITEM("OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS), 11162306a36Sopenharmony_ci SNMP_MIB_ITEM("InBcastOctets", IPSTATS_MIB_INBCASTOCTETS), 11262306a36Sopenharmony_ci SNMP_MIB_ITEM("OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS), 11362306a36Sopenharmony_ci /* Non RFC4293 fields */ 11462306a36Sopenharmony_ci SNMP_MIB_ITEM("InCsumErrors", IPSTATS_MIB_CSUMERRORS), 11562306a36Sopenharmony_ci SNMP_MIB_ITEM("InNoECTPkts", IPSTATS_MIB_NOECTPKTS), 11662306a36Sopenharmony_ci SNMP_MIB_ITEM("InECT1Pkts", IPSTATS_MIB_ECT1PKTS), 11762306a36Sopenharmony_ci SNMP_MIB_ITEM("InECT0Pkts", IPSTATS_MIB_ECT0PKTS), 11862306a36Sopenharmony_ci SNMP_MIB_ITEM("InCEPkts", IPSTATS_MIB_CEPKTS), 11962306a36Sopenharmony_ci SNMP_MIB_ITEM("ReasmOverlaps", IPSTATS_MIB_REASM_OVERLAPS), 12062306a36Sopenharmony_ci SNMP_MIB_SENTINEL 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistatic const struct { 12462306a36Sopenharmony_ci const char *name; 12562306a36Sopenharmony_ci int index; 12662306a36Sopenharmony_ci} icmpmibmap[] = { 12762306a36Sopenharmony_ci { "DestUnreachs", ICMP_DEST_UNREACH }, 12862306a36Sopenharmony_ci { "TimeExcds", ICMP_TIME_EXCEEDED }, 12962306a36Sopenharmony_ci { "ParmProbs", ICMP_PARAMETERPROB }, 13062306a36Sopenharmony_ci { "SrcQuenchs", ICMP_SOURCE_QUENCH }, 13162306a36Sopenharmony_ci { "Redirects", ICMP_REDIRECT }, 13262306a36Sopenharmony_ci { "Echos", ICMP_ECHO }, 13362306a36Sopenharmony_ci { "EchoReps", ICMP_ECHOREPLY }, 13462306a36Sopenharmony_ci { "Timestamps", ICMP_TIMESTAMP }, 13562306a36Sopenharmony_ci { "TimestampReps", ICMP_TIMESTAMPREPLY }, 13662306a36Sopenharmony_ci { "AddrMasks", ICMP_ADDRESS }, 13762306a36Sopenharmony_ci { "AddrMaskReps", ICMP_ADDRESSREPLY }, 13862306a36Sopenharmony_ci { NULL, 0 } 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistatic const struct snmp_mib snmp4_tcp_list[] = { 14362306a36Sopenharmony_ci SNMP_MIB_ITEM("RtoAlgorithm", TCP_MIB_RTOALGORITHM), 14462306a36Sopenharmony_ci SNMP_MIB_ITEM("RtoMin", TCP_MIB_RTOMIN), 14562306a36Sopenharmony_ci SNMP_MIB_ITEM("RtoMax", TCP_MIB_RTOMAX), 14662306a36Sopenharmony_ci SNMP_MIB_ITEM("MaxConn", TCP_MIB_MAXCONN), 14762306a36Sopenharmony_ci SNMP_MIB_ITEM("ActiveOpens", TCP_MIB_ACTIVEOPENS), 14862306a36Sopenharmony_ci SNMP_MIB_ITEM("PassiveOpens", TCP_MIB_PASSIVEOPENS), 14962306a36Sopenharmony_ci SNMP_MIB_ITEM("AttemptFails", TCP_MIB_ATTEMPTFAILS), 15062306a36Sopenharmony_ci SNMP_MIB_ITEM("EstabResets", TCP_MIB_ESTABRESETS), 15162306a36Sopenharmony_ci SNMP_MIB_ITEM("CurrEstab", TCP_MIB_CURRESTAB), 15262306a36Sopenharmony_ci SNMP_MIB_ITEM("InSegs", TCP_MIB_INSEGS), 15362306a36Sopenharmony_ci SNMP_MIB_ITEM("OutSegs", TCP_MIB_OUTSEGS), 15462306a36Sopenharmony_ci SNMP_MIB_ITEM("RetransSegs", TCP_MIB_RETRANSSEGS), 15562306a36Sopenharmony_ci SNMP_MIB_ITEM("InErrs", TCP_MIB_INERRS), 15662306a36Sopenharmony_ci SNMP_MIB_ITEM("OutRsts", TCP_MIB_OUTRSTS), 15762306a36Sopenharmony_ci SNMP_MIB_ITEM("InCsumErrors", TCP_MIB_CSUMERRORS), 15862306a36Sopenharmony_ci SNMP_MIB_SENTINEL 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistatic const struct snmp_mib snmp4_udp_list[] = { 16262306a36Sopenharmony_ci SNMP_MIB_ITEM("InDatagrams", UDP_MIB_INDATAGRAMS), 16362306a36Sopenharmony_ci SNMP_MIB_ITEM("NoPorts", UDP_MIB_NOPORTS), 16462306a36Sopenharmony_ci SNMP_MIB_ITEM("InErrors", UDP_MIB_INERRORS), 16562306a36Sopenharmony_ci SNMP_MIB_ITEM("OutDatagrams", UDP_MIB_OUTDATAGRAMS), 16662306a36Sopenharmony_ci SNMP_MIB_ITEM("RcvbufErrors", UDP_MIB_RCVBUFERRORS), 16762306a36Sopenharmony_ci SNMP_MIB_ITEM("SndbufErrors", UDP_MIB_SNDBUFERRORS), 16862306a36Sopenharmony_ci SNMP_MIB_ITEM("InCsumErrors", UDP_MIB_CSUMERRORS), 16962306a36Sopenharmony_ci SNMP_MIB_ITEM("IgnoredMulti", UDP_MIB_IGNOREDMULTI), 17062306a36Sopenharmony_ci SNMP_MIB_ITEM("MemErrors", UDP_MIB_MEMERRORS), 17162306a36Sopenharmony_ci SNMP_MIB_SENTINEL 17262306a36Sopenharmony_ci}; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic const struct snmp_mib snmp4_net_list[] = { 17562306a36Sopenharmony_ci SNMP_MIB_ITEM("SyncookiesSent", LINUX_MIB_SYNCOOKIESSENT), 17662306a36Sopenharmony_ci SNMP_MIB_ITEM("SyncookiesRecv", LINUX_MIB_SYNCOOKIESRECV), 17762306a36Sopenharmony_ci SNMP_MIB_ITEM("SyncookiesFailed", LINUX_MIB_SYNCOOKIESFAILED), 17862306a36Sopenharmony_ci SNMP_MIB_ITEM("EmbryonicRsts", LINUX_MIB_EMBRYONICRSTS), 17962306a36Sopenharmony_ci SNMP_MIB_ITEM("PruneCalled", LINUX_MIB_PRUNECALLED), 18062306a36Sopenharmony_ci SNMP_MIB_ITEM("RcvPruned", LINUX_MIB_RCVPRUNED), 18162306a36Sopenharmony_ci SNMP_MIB_ITEM("OfoPruned", LINUX_MIB_OFOPRUNED), 18262306a36Sopenharmony_ci SNMP_MIB_ITEM("OutOfWindowIcmps", LINUX_MIB_OUTOFWINDOWICMPS), 18362306a36Sopenharmony_ci SNMP_MIB_ITEM("LockDroppedIcmps", LINUX_MIB_LOCKDROPPEDICMPS), 18462306a36Sopenharmony_ci SNMP_MIB_ITEM("ArpFilter", LINUX_MIB_ARPFILTER), 18562306a36Sopenharmony_ci SNMP_MIB_ITEM("TW", LINUX_MIB_TIMEWAITED), 18662306a36Sopenharmony_ci SNMP_MIB_ITEM("TWRecycled", LINUX_MIB_TIMEWAITRECYCLED), 18762306a36Sopenharmony_ci SNMP_MIB_ITEM("TWKilled", LINUX_MIB_TIMEWAITKILLED), 18862306a36Sopenharmony_ci SNMP_MIB_ITEM("PAWSActive", LINUX_MIB_PAWSACTIVEREJECTED), 18962306a36Sopenharmony_ci SNMP_MIB_ITEM("PAWSEstab", LINUX_MIB_PAWSESTABREJECTED), 19062306a36Sopenharmony_ci SNMP_MIB_ITEM("DelayedACKs", LINUX_MIB_DELAYEDACKS), 19162306a36Sopenharmony_ci SNMP_MIB_ITEM("DelayedACKLocked", LINUX_MIB_DELAYEDACKLOCKED), 19262306a36Sopenharmony_ci SNMP_MIB_ITEM("DelayedACKLost", LINUX_MIB_DELAYEDACKLOST), 19362306a36Sopenharmony_ci SNMP_MIB_ITEM("ListenOverflows", LINUX_MIB_LISTENOVERFLOWS), 19462306a36Sopenharmony_ci SNMP_MIB_ITEM("ListenDrops", LINUX_MIB_LISTENDROPS), 19562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPHPHits", LINUX_MIB_TCPHPHITS), 19662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPPureAcks", LINUX_MIB_TCPPUREACKS), 19762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPHPAcks", LINUX_MIB_TCPHPACKS), 19862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRenoRecovery", LINUX_MIB_TCPRENORECOVERY), 19962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSackRecovery", LINUX_MIB_TCPSACKRECOVERY), 20062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSACKReneging", LINUX_MIB_TCPSACKRENEGING), 20162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSACKReorder", LINUX_MIB_TCPSACKREORDER), 20262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRenoReorder", LINUX_MIB_TCPRENOREORDER), 20362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPTSReorder", LINUX_MIB_TCPTSREORDER), 20462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFullUndo", LINUX_MIB_TCPFULLUNDO), 20562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPPartialUndo", LINUX_MIB_TCPPARTIALUNDO), 20662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKUndo", LINUX_MIB_TCPDSACKUNDO), 20762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPLossUndo", LINUX_MIB_TCPLOSSUNDO), 20862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPLostRetransmit", LINUX_MIB_TCPLOSTRETRANSMIT), 20962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRenoFailures", LINUX_MIB_TCPRENOFAILURES), 21062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSackFailures", LINUX_MIB_TCPSACKFAILURES), 21162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPLossFailures", LINUX_MIB_TCPLOSSFAILURES), 21262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastRetrans", LINUX_MIB_TCPFASTRETRANS), 21362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSlowStartRetrans", LINUX_MIB_TCPSLOWSTARTRETRANS), 21462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPTimeouts", LINUX_MIB_TCPTIMEOUTS), 21562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPLossProbes", LINUX_MIB_TCPLOSSPROBES), 21662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPLossProbeRecovery", LINUX_MIB_TCPLOSSPROBERECOVERY), 21762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRenoRecoveryFail", LINUX_MIB_TCPRENORECOVERYFAIL), 21862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSackRecoveryFail", LINUX_MIB_TCPSACKRECOVERYFAIL), 21962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRcvCollapsed", LINUX_MIB_TCPRCVCOLLAPSED), 22062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPBacklogCoalesce", LINUX_MIB_TCPBACKLOGCOALESCE), 22162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKOldSent", LINUX_MIB_TCPDSACKOLDSENT), 22262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKOfoSent", LINUX_MIB_TCPDSACKOFOSENT), 22362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKRecv", LINUX_MIB_TCPDSACKRECV), 22462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKOfoRecv", LINUX_MIB_TCPDSACKOFORECV), 22562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAbortOnData", LINUX_MIB_TCPABORTONDATA), 22662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAbortOnClose", LINUX_MIB_TCPABORTONCLOSE), 22762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAbortOnMemory", LINUX_MIB_TCPABORTONMEMORY), 22862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAbortOnTimeout", LINUX_MIB_TCPABORTONTIMEOUT), 22962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAbortOnLinger", LINUX_MIB_TCPABORTONLINGER), 23062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAbortFailed", LINUX_MIB_TCPABORTFAILED), 23162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMemoryPressures", LINUX_MIB_TCPMEMORYPRESSURES), 23262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMemoryPressuresChrono", LINUX_MIB_TCPMEMORYPRESSURESCHRONO), 23362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSACKDiscard", LINUX_MIB_TCPSACKDISCARD), 23462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKIgnoredOld", LINUX_MIB_TCPDSACKIGNOREDOLD), 23562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKIgnoredNoUndo", LINUX_MIB_TCPDSACKIGNOREDNOUNDO), 23662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSpuriousRTOs", LINUX_MIB_TCPSPURIOUSRTOS), 23762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMD5NotFound", LINUX_MIB_TCPMD5NOTFOUND), 23862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMD5Unexpected", LINUX_MIB_TCPMD5UNEXPECTED), 23962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMD5Failure", LINUX_MIB_TCPMD5FAILURE), 24062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSackShifted", LINUX_MIB_SACKSHIFTED), 24162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSackMerged", LINUX_MIB_SACKMERGED), 24262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSackShiftFallback", LINUX_MIB_SACKSHIFTFALLBACK), 24362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPBacklogDrop", LINUX_MIB_TCPBACKLOGDROP), 24462306a36Sopenharmony_ci SNMP_MIB_ITEM("PFMemallocDrop", LINUX_MIB_PFMEMALLOCDROP), 24562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP), 24662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDeferAcceptDrop", LINUX_MIB_TCPDEFERACCEPTDROP), 24762306a36Sopenharmony_ci SNMP_MIB_ITEM("IPReversePathFilter", LINUX_MIB_IPRPFILTER), 24862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPTimeWaitOverflow", LINUX_MIB_TCPTIMEWAITOVERFLOW), 24962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPReqQFullDoCookies", LINUX_MIB_TCPREQQFULLDOCOOKIES), 25062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP), 25162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL), 25262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRcvCoalesce", LINUX_MIB_TCPRCVCOALESCE), 25362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPOFOQueue", LINUX_MIB_TCPOFOQUEUE), 25462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPOFODrop", LINUX_MIB_TCPOFODROP), 25562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPOFOMerge", LINUX_MIB_TCPOFOMERGE), 25662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK), 25762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSYNChallenge", LINUX_MIB_TCPSYNCHALLENGE), 25862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenActive", LINUX_MIB_TCPFASTOPENACTIVE), 25962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenActiveFail", LINUX_MIB_TCPFASTOPENACTIVEFAIL), 26062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenPassive", LINUX_MIB_TCPFASTOPENPASSIVE), 26162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenPassiveFail", LINUX_MIB_TCPFASTOPENPASSIVEFAIL), 26262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenListenOverflow", LINUX_MIB_TCPFASTOPENLISTENOVERFLOW), 26362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenCookieReqd", LINUX_MIB_TCPFASTOPENCOOKIEREQD), 26462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenBlackhole", LINUX_MIB_TCPFASTOPENBLACKHOLE), 26562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSpuriousRtxHostQueues", LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES), 26662306a36Sopenharmony_ci SNMP_MIB_ITEM("BusyPollRxPackets", LINUX_MIB_BUSYPOLLRXPACKETS), 26762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAutoCorking", LINUX_MIB_TCPAUTOCORKING), 26862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFromZeroWindowAdv", LINUX_MIB_TCPFROMZEROWINDOWADV), 26962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPToZeroWindowAdv", LINUX_MIB_TCPTOZEROWINDOWADV), 27062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPWantZeroWindowAdv", LINUX_MIB_TCPWANTZEROWINDOWADV), 27162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPSynRetrans", LINUX_MIB_TCPSYNRETRANS), 27262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPOrigDataSent", LINUX_MIB_TCPORIGDATASENT), 27362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPHystartTrainDetect", LINUX_MIB_TCPHYSTARTTRAINDETECT), 27462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPHystartTrainCwnd", LINUX_MIB_TCPHYSTARTTRAINCWND), 27562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPHystartDelayDetect", LINUX_MIB_TCPHYSTARTDELAYDETECT), 27662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPHystartDelayCwnd", LINUX_MIB_TCPHYSTARTDELAYCWND), 27762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPACKSkippedSynRecv", LINUX_MIB_TCPACKSKIPPEDSYNRECV), 27862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPACKSkippedPAWS", LINUX_MIB_TCPACKSKIPPEDPAWS), 27962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPACKSkippedSeq", LINUX_MIB_TCPACKSKIPPEDSEQ), 28062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPACKSkippedFinWait2", LINUX_MIB_TCPACKSKIPPEDFINWAIT2), 28162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPACKSkippedTimeWait", LINUX_MIB_TCPACKSKIPPEDTIMEWAIT), 28262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPACKSkippedChallenge", LINUX_MIB_TCPACKSKIPPEDCHALLENGE), 28362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPWinProbe", LINUX_MIB_TCPWINPROBE), 28462306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPKeepAlive", LINUX_MIB_TCPKEEPALIVE), 28562306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMTUPFail", LINUX_MIB_TCPMTUPFAIL), 28662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMTUPSuccess", LINUX_MIB_TCPMTUPSUCCESS), 28762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDelivered", LINUX_MIB_TCPDELIVERED), 28862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDeliveredCE", LINUX_MIB_TCPDELIVEREDCE), 28962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPAckCompressed", LINUX_MIB_TCPACKCOMPRESSED), 29062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPZeroWindowDrop", LINUX_MIB_TCPZEROWINDOWDROP), 29162306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPRcvQDrop", LINUX_MIB_TCPRCVQDROP), 29262306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPWqueueTooBig", LINUX_MIB_TCPWQUEUETOOBIG), 29362306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPFastOpenPassiveAltKey", LINUX_MIB_TCPFASTOPENPASSIVEALTKEY), 29462306a36Sopenharmony_ci SNMP_MIB_ITEM("TcpTimeoutRehash", LINUX_MIB_TCPTIMEOUTREHASH), 29562306a36Sopenharmony_ci SNMP_MIB_ITEM("TcpDuplicateDataRehash", LINUX_MIB_TCPDUPLICATEDATAREHASH), 29662306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKRecvSegs", LINUX_MIB_TCPDSACKRECVSEGS), 29762306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPDSACKIgnoredDubious", LINUX_MIB_TCPDSACKIGNOREDDUBIOUS), 29862306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMigrateReqSuccess", LINUX_MIB_TCPMIGRATEREQSUCCESS), 29962306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPMigrateReqFailure", LINUX_MIB_TCPMIGRATEREQFAILURE), 30062306a36Sopenharmony_ci SNMP_MIB_ITEM("TCPPLBRehash", LINUX_MIB_TCPPLBREHASH), 30162306a36Sopenharmony_ci SNMP_MIB_SENTINEL 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic void icmpmsg_put_line(struct seq_file *seq, unsigned long *vals, 30562306a36Sopenharmony_ci unsigned short *type, int count) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci int j; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci if (count) { 31062306a36Sopenharmony_ci seq_puts(seq, "\nIcmpMsg:"); 31162306a36Sopenharmony_ci for (j = 0; j < count; ++j) 31262306a36Sopenharmony_ci seq_printf(seq, " %sType%u", 31362306a36Sopenharmony_ci type[j] & 0x100 ? "Out" : "In", 31462306a36Sopenharmony_ci type[j] & 0xff); 31562306a36Sopenharmony_ci seq_puts(seq, "\nIcmpMsg:"); 31662306a36Sopenharmony_ci for (j = 0; j < count; ++j) 31762306a36Sopenharmony_ci seq_printf(seq, " %lu", vals[j]); 31862306a36Sopenharmony_ci } 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic void icmpmsg_put(struct seq_file *seq) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci#define PERLINE 16 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci int i, count; 32662306a36Sopenharmony_ci unsigned short type[PERLINE]; 32762306a36Sopenharmony_ci unsigned long vals[PERLINE], val; 32862306a36Sopenharmony_ci struct net *net = seq->private; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci count = 0; 33162306a36Sopenharmony_ci for (i = 0; i < ICMPMSG_MIB_MAX; i++) { 33262306a36Sopenharmony_ci val = atomic_long_read(&net->mib.icmpmsg_statistics->mibs[i]); 33362306a36Sopenharmony_ci if (val) { 33462306a36Sopenharmony_ci type[count] = i; 33562306a36Sopenharmony_ci vals[count++] = val; 33662306a36Sopenharmony_ci } 33762306a36Sopenharmony_ci if (count == PERLINE) { 33862306a36Sopenharmony_ci icmpmsg_put_line(seq, vals, type, count); 33962306a36Sopenharmony_ci count = 0; 34062306a36Sopenharmony_ci } 34162306a36Sopenharmony_ci } 34262306a36Sopenharmony_ci icmpmsg_put_line(seq, vals, type, count); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci#undef PERLINE 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistatic void icmp_put(struct seq_file *seq) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci int i; 35062306a36Sopenharmony_ci struct net *net = seq->private; 35162306a36Sopenharmony_ci atomic_long_t *ptr = net->mib.icmpmsg_statistics->mibs; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci seq_puts(seq, "\nIcmp: InMsgs InErrors InCsumErrors"); 35462306a36Sopenharmony_ci for (i = 0; icmpmibmap[i].name; i++) 35562306a36Sopenharmony_ci seq_printf(seq, " In%s", icmpmibmap[i].name); 35662306a36Sopenharmony_ci seq_puts(seq, " OutMsgs OutErrors OutRateLimitGlobal OutRateLimitHost"); 35762306a36Sopenharmony_ci for (i = 0; icmpmibmap[i].name; i++) 35862306a36Sopenharmony_ci seq_printf(seq, " Out%s", icmpmibmap[i].name); 35962306a36Sopenharmony_ci seq_printf(seq, "\nIcmp: %lu %lu %lu", 36062306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_INMSGS), 36162306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_INERRORS), 36262306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_CSUMERRORS)); 36362306a36Sopenharmony_ci for (i = 0; icmpmibmap[i].name; i++) 36462306a36Sopenharmony_ci seq_printf(seq, " %lu", 36562306a36Sopenharmony_ci atomic_long_read(ptr + icmpmibmap[i].index)); 36662306a36Sopenharmony_ci seq_printf(seq, " %lu %lu %lu %lu", 36762306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_OUTMSGS), 36862306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_OUTERRORS), 36962306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_RATELIMITGLOBAL), 37062306a36Sopenharmony_ci snmp_fold_field(net->mib.icmp_statistics, ICMP_MIB_RATELIMITHOST)); 37162306a36Sopenharmony_ci for (i = 0; icmpmibmap[i].name; i++) 37262306a36Sopenharmony_ci seq_printf(seq, " %lu", 37362306a36Sopenharmony_ci atomic_long_read(ptr + (icmpmibmap[i].index | 0x100))); 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci/* 37762306a36Sopenharmony_ci * Called from the PROCfs module. This outputs /proc/net/snmp. 37862306a36Sopenharmony_ci */ 37962306a36Sopenharmony_cistatic int snmp_seq_show_ipstats(struct seq_file *seq, void *v) 38062306a36Sopenharmony_ci{ 38162306a36Sopenharmony_ci struct net *net = seq->private; 38262306a36Sopenharmony_ci u64 buff64[IPSTATS_MIB_MAX]; 38362306a36Sopenharmony_ci int i; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci memset(buff64, 0, IPSTATS_MIB_MAX * sizeof(u64)); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci seq_puts(seq, "Ip: Forwarding DefaultTTL"); 38862306a36Sopenharmony_ci for (i = 0; snmp4_ipstats_list[i].name; i++) 38962306a36Sopenharmony_ci seq_printf(seq, " %s", snmp4_ipstats_list[i].name); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci seq_printf(seq, "\nIp: %d %d", 39262306a36Sopenharmony_ci IPV4_DEVCONF_ALL(net, FORWARDING) ? 1 : 2, 39362306a36Sopenharmony_ci READ_ONCE(net->ipv4.sysctl_ip_default_ttl)); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci BUILD_BUG_ON(offsetof(struct ipstats_mib, mibs) != 0); 39662306a36Sopenharmony_ci snmp_get_cpu_field64_batch(buff64, snmp4_ipstats_list, 39762306a36Sopenharmony_ci net->mib.ip_statistics, 39862306a36Sopenharmony_ci offsetof(struct ipstats_mib, syncp)); 39962306a36Sopenharmony_ci for (i = 0; snmp4_ipstats_list[i].name; i++) 40062306a36Sopenharmony_ci seq_printf(seq, " %llu", buff64[i]); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci return 0; 40362306a36Sopenharmony_ci} 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_cistatic int snmp_seq_show_tcp_udp(struct seq_file *seq, void *v) 40662306a36Sopenharmony_ci{ 40762306a36Sopenharmony_ci unsigned long buff[TCPUDP_MIB_MAX]; 40862306a36Sopenharmony_ci struct net *net = seq->private; 40962306a36Sopenharmony_ci int i; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci memset(buff, 0, TCPUDP_MIB_MAX * sizeof(unsigned long)); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci seq_puts(seq, "\nTcp:"); 41462306a36Sopenharmony_ci for (i = 0; snmp4_tcp_list[i].name; i++) 41562306a36Sopenharmony_ci seq_printf(seq, " %s", snmp4_tcp_list[i].name); 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci seq_puts(seq, "\nTcp:"); 41862306a36Sopenharmony_ci snmp_get_cpu_field_batch(buff, snmp4_tcp_list, 41962306a36Sopenharmony_ci net->mib.tcp_statistics); 42062306a36Sopenharmony_ci for (i = 0; snmp4_tcp_list[i].name; i++) { 42162306a36Sopenharmony_ci /* MaxConn field is signed, RFC 2012 */ 42262306a36Sopenharmony_ci if (snmp4_tcp_list[i].entry == TCP_MIB_MAXCONN) 42362306a36Sopenharmony_ci seq_printf(seq, " %ld", buff[i]); 42462306a36Sopenharmony_ci else 42562306a36Sopenharmony_ci seq_printf(seq, " %lu", buff[i]); 42662306a36Sopenharmony_ci } 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci memset(buff, 0, TCPUDP_MIB_MAX * sizeof(unsigned long)); 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci snmp_get_cpu_field_batch(buff, snmp4_udp_list, 43162306a36Sopenharmony_ci net->mib.udp_statistics); 43262306a36Sopenharmony_ci seq_puts(seq, "\nUdp:"); 43362306a36Sopenharmony_ci for (i = 0; snmp4_udp_list[i].name; i++) 43462306a36Sopenharmony_ci seq_printf(seq, " %s", snmp4_udp_list[i].name); 43562306a36Sopenharmony_ci seq_puts(seq, "\nUdp:"); 43662306a36Sopenharmony_ci for (i = 0; snmp4_udp_list[i].name; i++) 43762306a36Sopenharmony_ci seq_printf(seq, " %lu", buff[i]); 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci memset(buff, 0, TCPUDP_MIB_MAX * sizeof(unsigned long)); 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci /* the UDP and UDP-Lite MIBs are the same */ 44262306a36Sopenharmony_ci seq_puts(seq, "\nUdpLite:"); 44362306a36Sopenharmony_ci snmp_get_cpu_field_batch(buff, snmp4_udp_list, 44462306a36Sopenharmony_ci net->mib.udplite_statistics); 44562306a36Sopenharmony_ci for (i = 0; snmp4_udp_list[i].name; i++) 44662306a36Sopenharmony_ci seq_printf(seq, " %s", snmp4_udp_list[i].name); 44762306a36Sopenharmony_ci seq_puts(seq, "\nUdpLite:"); 44862306a36Sopenharmony_ci for (i = 0; snmp4_udp_list[i].name; i++) 44962306a36Sopenharmony_ci seq_printf(seq, " %lu", buff[i]); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci seq_putc(seq, '\n'); 45262306a36Sopenharmony_ci return 0; 45362306a36Sopenharmony_ci} 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistatic int snmp_seq_show(struct seq_file *seq, void *v) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci snmp_seq_show_ipstats(seq, v); 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci icmp_put(seq); /* RFC 2011 compatibility */ 46062306a36Sopenharmony_ci icmpmsg_put(seq); 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci snmp_seq_show_tcp_udp(seq, v); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci return 0; 46562306a36Sopenharmony_ci} 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci/* 46862306a36Sopenharmony_ci * Output /proc/net/netstat 46962306a36Sopenharmony_ci */ 47062306a36Sopenharmony_cistatic int netstat_seq_show(struct seq_file *seq, void *v) 47162306a36Sopenharmony_ci{ 47262306a36Sopenharmony_ci const int ip_cnt = ARRAY_SIZE(snmp4_ipextstats_list) - 1; 47362306a36Sopenharmony_ci const int tcp_cnt = ARRAY_SIZE(snmp4_net_list) - 1; 47462306a36Sopenharmony_ci struct net *net = seq->private; 47562306a36Sopenharmony_ci unsigned long *buff; 47662306a36Sopenharmony_ci int i; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci seq_puts(seq, "TcpExt:"); 47962306a36Sopenharmony_ci for (i = 0; i < tcp_cnt; i++) 48062306a36Sopenharmony_ci seq_printf(seq, " %s", snmp4_net_list[i].name); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci seq_puts(seq, "\nTcpExt:"); 48362306a36Sopenharmony_ci buff = kzalloc(max(tcp_cnt * sizeof(long), ip_cnt * sizeof(u64)), 48462306a36Sopenharmony_ci GFP_KERNEL); 48562306a36Sopenharmony_ci if (buff) { 48662306a36Sopenharmony_ci snmp_get_cpu_field_batch(buff, snmp4_net_list, 48762306a36Sopenharmony_ci net->mib.net_statistics); 48862306a36Sopenharmony_ci for (i = 0; i < tcp_cnt; i++) 48962306a36Sopenharmony_ci seq_printf(seq, " %lu", buff[i]); 49062306a36Sopenharmony_ci } else { 49162306a36Sopenharmony_ci for (i = 0; i < tcp_cnt; i++) 49262306a36Sopenharmony_ci seq_printf(seq, " %lu", 49362306a36Sopenharmony_ci snmp_fold_field(net->mib.net_statistics, 49462306a36Sopenharmony_ci snmp4_net_list[i].entry)); 49562306a36Sopenharmony_ci } 49662306a36Sopenharmony_ci seq_puts(seq, "\nIpExt:"); 49762306a36Sopenharmony_ci for (i = 0; i < ip_cnt; i++) 49862306a36Sopenharmony_ci seq_printf(seq, " %s", snmp4_ipextstats_list[i].name); 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci seq_puts(seq, "\nIpExt:"); 50162306a36Sopenharmony_ci if (buff) { 50262306a36Sopenharmony_ci u64 *buff64 = (u64 *)buff; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci memset(buff64, 0, ip_cnt * sizeof(u64)); 50562306a36Sopenharmony_ci snmp_get_cpu_field64_batch(buff64, snmp4_ipextstats_list, 50662306a36Sopenharmony_ci net->mib.ip_statistics, 50762306a36Sopenharmony_ci offsetof(struct ipstats_mib, syncp)); 50862306a36Sopenharmony_ci for (i = 0; i < ip_cnt; i++) 50962306a36Sopenharmony_ci seq_printf(seq, " %llu", buff64[i]); 51062306a36Sopenharmony_ci } else { 51162306a36Sopenharmony_ci for (i = 0; i < ip_cnt; i++) 51262306a36Sopenharmony_ci seq_printf(seq, " %llu", 51362306a36Sopenharmony_ci snmp_fold_field64(net->mib.ip_statistics, 51462306a36Sopenharmony_ci snmp4_ipextstats_list[i].entry, 51562306a36Sopenharmony_ci offsetof(struct ipstats_mib, syncp))); 51662306a36Sopenharmony_ci } 51762306a36Sopenharmony_ci kfree(buff); 51862306a36Sopenharmony_ci seq_putc(seq, '\n'); 51962306a36Sopenharmony_ci mptcp_seq_show(seq); 52062306a36Sopenharmony_ci return 0; 52162306a36Sopenharmony_ci} 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_cistatic __net_init int ip_proc_init_net(struct net *net) 52462306a36Sopenharmony_ci{ 52562306a36Sopenharmony_ci if (!proc_create_net_single("sockstat", 0444, net->proc_net, 52662306a36Sopenharmony_ci sockstat_seq_show, NULL)) 52762306a36Sopenharmony_ci goto out_sockstat; 52862306a36Sopenharmony_ci if (!proc_create_net_single("netstat", 0444, net->proc_net, 52962306a36Sopenharmony_ci netstat_seq_show, NULL)) 53062306a36Sopenharmony_ci goto out_netstat; 53162306a36Sopenharmony_ci if (!proc_create_net_single("snmp", 0444, net->proc_net, snmp_seq_show, 53262306a36Sopenharmony_ci NULL)) 53362306a36Sopenharmony_ci goto out_snmp; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci return 0; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ciout_snmp: 53862306a36Sopenharmony_ci remove_proc_entry("netstat", net->proc_net); 53962306a36Sopenharmony_ciout_netstat: 54062306a36Sopenharmony_ci remove_proc_entry("sockstat", net->proc_net); 54162306a36Sopenharmony_ciout_sockstat: 54262306a36Sopenharmony_ci return -ENOMEM; 54362306a36Sopenharmony_ci} 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_cistatic __net_exit void ip_proc_exit_net(struct net *net) 54662306a36Sopenharmony_ci{ 54762306a36Sopenharmony_ci remove_proc_entry("snmp", net->proc_net); 54862306a36Sopenharmony_ci remove_proc_entry("netstat", net->proc_net); 54962306a36Sopenharmony_ci remove_proc_entry("sockstat", net->proc_net); 55062306a36Sopenharmony_ci} 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_cistatic __net_initdata struct pernet_operations ip_proc_ops = { 55362306a36Sopenharmony_ci .init = ip_proc_init_net, 55462306a36Sopenharmony_ci .exit = ip_proc_exit_net, 55562306a36Sopenharmony_ci}; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ciint __init ip_misc_proc_init(void) 55862306a36Sopenharmony_ci{ 55962306a36Sopenharmony_ci return register_pernet_subsys(&ip_proc_ops); 56062306a36Sopenharmony_ci} 561