56#ifndef LWIP_HDR_STATS_H
57#define LWIP_HDR_STATS_H
70#ifndef LWIP_STATS_LARGE
71#define LWIP_STATS_LARGE 0
75#define STAT_COUNTER u32_t
76#define STAT_COUNTER_F U32_F
78#define STAT_COUNTER u16_t
79#define STAT_COUNTER_F U16_F
95 STAT_COUNTER cachehit;
106 STAT_COUNTER proterr;
108 STAT_COUNTER rx_group;
109 STAT_COUNTER rx_general;
110 STAT_COUNTER rx_report;
111 STAT_COUNTER tx_join;
112 STAT_COUNTER tx_leave;
113 STAT_COUNTER tx_report;
118#if defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY
125 STAT_COUNTER illegal;
129struct stats_syselem {
137 struct stats_syselem sem;
138 struct stats_syselem mutex;
139 struct stats_syselem mbox;
146 u32_t ipinaddrerrors;
147 u32_t ipinunknownprotos;
159 u32_t ipforwdatagrams;
163 u32_t tcpactiveopens;
164 u32_t tcppassiveopens;
165 u32_t tcpattemptfails;
166 u32_t tcpestabresets;
168 u32_t tcpretranssegs;
174 u32_t udpindatagrams;
177 u32_t udpoutdatagrams;
182 u32_t icmpindestunreachs;
183 u32_t icmpintimeexcds;
184 u32_t icmpinparmprobs;
185 u32_t icmpinsrcquenchs;
186 u32_t icmpinredirects;
188 u32_t icmpinechoreps;
189 u32_t icmpintimestamps;
190 u32_t icmpintimestampreps;
191 u32_t icmpinaddrmasks;
192 u32_t icmpinaddrmaskreps;
195 u32_t icmpoutdestunreachs;
196 u32_t icmpouttimeexcds;
198 u32_t icmpoutechoreps;
205struct stats_mib2_netif_ctrs {
213 u32_t ifinnucastpkts;
229 u32_t ifinunknownprotos;
235 u32_t ifoutucastpkts;
239 u32_t ifoutnucastpkts;
254 struct stats_proto link;
258 struct stats_proto etharp;
262 struct stats_proto ip_frag;
266 struct stats_proto ip;
270 struct stats_proto icmp;
274 struct stats_igmp igmp;
278 struct stats_proto udp;
282 struct stats_proto tcp;
286 struct stats_mem
mem;
290 struct stats_mem *
memp[MEMP_MAX];
294 struct stats_sys sys;
298 struct stats_proto ip6;
302 struct stats_proto icmp6;
306 struct stats_proto ip6_frag;
310 struct stats_igmp mld6;
314 struct stats_proto nd6;
318 struct stats_mib2 mib2;
323extern struct stats_ lwip_stats;
326void stats_init(
void);
328#define STATS_INC(x) ++lwip_stats.x
329#define STATS_DEC(x) --lwip_stats.x
330#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \
331 if (lwip_stats.x.max < lwip_stats.x.used) { \
332 lwip_stats.x.max = lwip_stats.x.used; \
335#define STATS_GET(x) lwip_stats.x
340#define STATS_INC_USED(x)
344#define TCP_STATS_INC(x) STATS_INC(x)
345#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP")
347#define TCP_STATS_INC(x)
348#define TCP_STATS_DISPLAY()
352#define UDP_STATS_INC(x) STATS_INC(x)
353#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP")
355#define UDP_STATS_INC(x)
356#define UDP_STATS_DISPLAY()
360#define ICMP_STATS_INC(x) STATS_INC(x)
361#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP")
363#define ICMP_STATS_INC(x)
364#define ICMP_STATS_DISPLAY()
368#define IGMP_STATS_INC(x) STATS_INC(x)
369#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp, "IGMP")
371#define IGMP_STATS_INC(x)
372#define IGMP_STATS_DISPLAY()
376#define IP_STATS_INC(x) STATS_INC(x)
377#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP")
379#define IP_STATS_INC(x)
380#define IP_STATS_DISPLAY()
384#define IPFRAG_STATS_INC(x) STATS_INC(x)
385#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG")
387#define IPFRAG_STATS_INC(x)
388#define IPFRAG_STATS_DISPLAY()
392#define ETHARP_STATS_INC(x) STATS_INC(x)
393#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP")
395#define ETHARP_STATS_INC(x)
396#define ETHARP_STATS_DISPLAY()
400#define LINK_STATS_INC(x) STATS_INC(x)
401#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK")
403#define LINK_STATS_INC(x)
404#define LINK_STATS_DISPLAY()
408#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y
409#define MEM_STATS_INC(x) STATS_INC(mem.x)
410#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y)
411#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y
412#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP")
414#define MEM_STATS_AVAIL(x, y)
415#define MEM_STATS_INC(x)
416#define MEM_STATS_INC_USED(x, y)
417#define MEM_STATS_DEC_USED(x, y)
418#define MEM_STATS_DISPLAY()
422#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i]->x)
423#define MEMP_STATS_DISPLAY(i) stats_display_memp(lwip_stats.memp[i], i)
424#define MEMP_STATS_GET(x, i) STATS_GET(memp[i]->x)
426#define MEMP_STATS_DEC(x, i)
427#define MEMP_STATS_DISPLAY(i)
428#define MEMP_STATS_GET(x, i) 0
432#define SYS_STATS_INC(x) STATS_INC(sys.x)
433#define SYS_STATS_DEC(x) STATS_DEC(sys.x)
434#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1)
435#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)
437#define SYS_STATS_INC(x)
438#define SYS_STATS_DEC(x)
439#define SYS_STATS_INC_USED(x)
440#define SYS_STATS_DISPLAY()
444#define IP6_STATS_INC(x) STATS_INC(x)
445#define IP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6, "IPv6")
447#define IP6_STATS_INC(x)
448#define IP6_STATS_DISPLAY()
452#define ICMP6_STATS_INC(x) STATS_INC(x)
453#define ICMP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp6, "ICMPv6")
455#define ICMP6_STATS_INC(x)
456#define ICMP6_STATS_DISPLAY()
460#define IP6_FRAG_STATS_INC(x) STATS_INC(x)
461#define IP6_FRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6_frag, "IPv6 FRAG")
463#define IP6_FRAG_STATS_INC(x)
464#define IP6_FRAG_STATS_DISPLAY()
468#define MLD6_STATS_INC(x) STATS_INC(x)
469#define MLD6_STATS_DISPLAY() stats_display_igmp(&lwip_stats.mld6, "MLDv1")
471#define MLD6_STATS_INC(x)
472#define MLD6_STATS_DISPLAY()
476#define ND6_STATS_INC(x) STATS_INC(x)
477#define ND6_STATS_DISPLAY() stats_display_proto(&lwip_stats.nd6, "ND")
479#define ND6_STATS_INC(x)
480#define ND6_STATS_DISPLAY()
484#define MIB2_STATS_INC(x) STATS_INC(x)
486#define MIB2_STATS_INC(x)
490#if LWIP_STATS_DISPLAY
491void stats_display(
void);
492void stats_display_proto(
struct stats_proto *proto,
const char *name);
493void stats_display_igmp(
struct stats_igmp *igmp,
const char *name);
494void stats_display_mem(
struct stats_mem *
mem,
const char *name);
495void stats_display_memp(
struct stats_mem *
mem,
int index);
496void stats_display_sys(
struct stats_sys *sys);
498#define stats_display()
499#define stats_display_proto(proto, name)
500#define stats_display_igmp(igmp, name)
501#define stats_display_mem(mem, name)
502#define stats_display_memp(mem, index)
503#define stats_display_sys(sys)