Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *		SNMP MIB entries for the IP subsystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *		
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *		Alan Cox <gw4pts@gw4pts.ampr.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *		We don't chose to implement SNMP in the kernel (this would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *		be silly as SNMP is a pain in the backside in places). We do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *		however need to collect the MIB statistics and export them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *		out of /proc (eventually)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #ifndef _SNMP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define _SNMP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/snmp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/smp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  * Mibs are stored in array of unsigned long.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * struct snmp_mib{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *  - list of entries for particular API (such as /proc/net/snmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *  - name of entries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) struct snmp_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	int entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define SNMP_MIB_ITEM(_name,_entry)	{	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	.name = _name,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	.entry = _entry,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #define SNMP_MIB_SENTINEL {	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	.name = NULL,		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	.entry = 0,		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  * We use unsigned longs for most mibs but u64 for ipstats.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #include <linux/u64_stats_sync.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) /* IPstats */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define IPSTATS_MIB_MAX	__IPSTATS_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) struct ipstats_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	/* mibs[] must be first field of struct ipstats_mib */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	u64		mibs[IPSTATS_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	struct u64_stats_sync syncp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) /* ICMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #define ICMP_MIB_MAX	__ICMP_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) struct icmp_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	unsigned long	mibs[ICMP_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define ICMPMSG_MIB_MAX	__ICMPMSG_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) struct icmpmsg_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	atomic_long_t	mibs[ICMPMSG_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) /* ICMP6 (IPv6-ICMP) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #define ICMP6_MIB_MAX	__ICMP6_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) /* per network ns counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) struct icmpv6_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	unsigned long	mibs[ICMP6_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) /* per device counters, (shared on all cpus) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) struct icmpv6_mib_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	atomic_long_t	mibs[ICMP6_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) #define ICMP6MSG_MIB_MAX  __ICMP6MSG_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) /* per network ns counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) struct icmpv6msg_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	atomic_long_t	mibs[ICMP6MSG_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) /* per device counters, (shared on all cpus) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) struct icmpv6msg_mib_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	atomic_long_t	mibs[ICMP6MSG_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) /* TCP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) #define TCP_MIB_MAX	__TCP_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) struct tcp_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	unsigned long	mibs[TCP_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) /* UDP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) #define UDP_MIB_MAX	__UDP_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) struct udp_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	unsigned long	mibs[UDP_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* Linux */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define LINUX_MIB_MAX	__LINUX_MIB_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct linux_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	unsigned long	mibs[LINUX_MIB_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* Linux Xfrm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define LINUX_MIB_XFRMMAX	__LINUX_MIB_XFRMMAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct linux_xfrm_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	unsigned long	mibs[LINUX_MIB_XFRMMAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /* Linux TLS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define LINUX_MIB_TLSMAX	__LINUX_MIB_TLSMAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct linux_tls_mib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	unsigned long	mibs[LINUX_MIB_TLSMAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define DEFINE_SNMP_STAT(type, name)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	__typeof__(type) __percpu *name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define DEFINE_SNMP_STAT_ATOMIC(type, name)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	__typeof__(type) *name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define DECLARE_SNMP_STAT(type, name)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	extern __typeof__(type) __percpu *name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define __SNMP_INC_STATS(mib, field)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 			__this_cpu_inc(mib->mibs[field])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define SNMP_INC_STATS_ATOMIC_LONG(mib, field)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 			atomic_long_inc(&mib->mibs[field])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SNMP_INC_STATS(mib, field)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 			this_cpu_inc(mib->mibs[field])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SNMP_DEC_STATS(mib, field)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 			this_cpu_dec(mib->mibs[field])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define __SNMP_ADD_STATS(mib, field, addend)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 			__this_cpu_add(mib->mibs[field], addend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SNMP_ADD_STATS(mib, field, addend)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 			this_cpu_add(mib->mibs[field], addend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SNMP_UPD_PO_STATS(mib, basefield, addend)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		__typeof__((mib->mibs) + 0) ptr = mib->mibs;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		this_cpu_inc(ptr[basefield##PKTS]);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		this_cpu_add(ptr[basefield##OCTETS], addend);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define __SNMP_UPD_PO_STATS(mib, basefield, addend)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		__typeof__((mib->mibs) + 0) ptr = mib->mibs;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		__this_cpu_inc(ptr[basefield##PKTS]);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 		__this_cpu_add(ptr[basefield##OCTETS], addend);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #if BITS_PER_LONG==32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define __SNMP_ADD_STATS64(mib, field, addend) 				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 		__typeof__(*mib) *ptr = raw_cpu_ptr(mib);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 		u64_stats_update_begin(&ptr->syncp);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 		ptr->mibs[field] += addend;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 		u64_stats_update_end(&ptr->syncp);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define SNMP_ADD_STATS64(mib, field, addend) 				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		local_bh_disable();					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 		__SNMP_ADD_STATS64(mib, field, addend);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		local_bh_enable();				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define __SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define __SNMP_UPD_PO_STATS64(mib, basefield, addend)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		__typeof__(*mib) *ptr;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		ptr = raw_cpu_ptr((mib));				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		u64_stats_update_begin(&ptr->syncp);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		ptr->mibs[basefield##PKTS]++;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		ptr->mibs[basefield##OCTETS] += addend;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		u64_stats_update_end(&ptr->syncp);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define SNMP_UPD_PO_STATS64(mib, basefield, addend)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		local_bh_disable();					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		__SNMP_UPD_PO_STATS64(mib, basefield, addend);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		local_bh_enable();				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define __SNMP_INC_STATS64(mib, field)		__SNMP_INC_STATS(mib, field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #define SNMP_INC_STATS64(mib, field)		SNMP_INC_STATS(mib, field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define SNMP_DEC_STATS64(mib, field)		SNMP_DEC_STATS(mib, field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define __SNMP_ADD_STATS64(mib, field, addend)	__SNMP_ADD_STATS(mib, field, addend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define SNMP_ADD_STATS64(mib, field, addend)	SNMP_ADD_STATS(mib, field, addend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define SNMP_UPD_PO_STATS64(mib, basefield, addend) SNMP_UPD_PO_STATS(mib, basefield, addend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define __SNMP_UPD_PO_STATS64(mib, basefield, addend) __SNMP_UPD_PO_STATS(mib, basefield, addend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) #endif