1 /** @file
2  * @brief Network statistics
3  *
4  * Network statistics data. This should only be enabled when
5  * debugging as it consumes memory.
6  */
7 
8 /*
9  * Copyright (c) 2016 Intel Corporation
10  *
11  * SPDX-License-Identifier: Apache-2.0
12  */
13 
14 #ifndef ZEPHYR_INCLUDE_NET_NET_STATS_H_
15 #define ZEPHYR_INCLUDE_NET_NET_STATS_H_
16 
17 #include <zephyr/types.h>
18 #include <zephyr/net/net_core.h>
19 #include <zephyr/net/net_mgmt.h>
20 
21 #include <zephyr/net/prometheus/collector.h>
22 #include <zephyr/net/prometheus/counter.h>
23 #include <zephyr/net/prometheus/metric.h>
24 #include <zephyr/net/prometheus/gauge.h>
25 #include <zephyr/net/prometheus/histogram.h>
26 #include <zephyr/net/prometheus/summary.h>
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 /**
33  * @brief Network statistics library
34  * @defgroup net_stats Network Statistics Library
35  * @since 1.5
36  * @version 0.8.0
37  * @ingroup networking
38  * @{
39  */
40 
41 /**
42  * @typedef net_stats_t
43  * @brief Network statistics counter
44  */
45 typedef uint32_t net_stats_t;
46 
47 /**
48  * @brief Number of bytes sent and received.
49  */
50 struct net_stats_bytes {
51 	/** Number of bytes sent */
52 	uint64_t sent;
53 	/** Number of bytes received */
54 	uint64_t received;
55 };
56 
57 /**
58  * @brief Number of network packets sent and received.
59  */
60 struct net_stats_pkts {
61 	/** Number of packets sent */
62 	net_stats_t tx;
63 	/** Number of packets received */
64 	net_stats_t rx;
65 };
66 
67 /**
68  * @brief IP layer statistics
69  */
70 struct net_stats_ip {
71 	/** Number of received packets at the IP layer. */
72 	net_stats_t recv;
73 
74 	/** Number of sent packets at the IP layer. */
75 	net_stats_t sent;
76 
77 	/** Number of forwarded packets at the IP layer. */
78 	net_stats_t forwarded;
79 
80 	/** Number of dropped packets at the IP layer. */
81 	net_stats_t drop;
82 };
83 
84 /**
85  * @brief IP layer error statistics
86  */
87 struct net_stats_ip_errors {
88 	/** Number of packets dropped due to wrong IP version
89 	 * or header length.
90 	 */
91 	net_stats_t vhlerr;
92 
93 	 /** Number of packets dropped due to wrong IP length, high byte. */
94 	net_stats_t hblenerr;
95 
96 	/** Number of packets dropped due to wrong IP length, low byte. */
97 	net_stats_t lblenerr;
98 
99 	/** Number of packets dropped because they were IP fragments. */
100 	net_stats_t fragerr;
101 
102 	/** Number of packets dropped due to IP checksum errors. */
103 	net_stats_t chkerr;
104 
105 	/** Number of packets dropped because they were neither ICMP,
106 	 * UDP nor TCP.
107 	 */
108 	net_stats_t protoerr;
109 };
110 
111 /**
112  * @brief ICMP statistics
113  */
114 struct net_stats_icmp {
115 	/** Number of received ICMP packets. */
116 	net_stats_t recv;
117 
118 	/** Number of sent ICMP packets. */
119 	net_stats_t sent;
120 
121 	/** Number of dropped ICMP packets. */
122 	net_stats_t drop;
123 
124 	/** Number of ICMP packets with a wrong type. */
125 	net_stats_t typeerr;
126 
127 	/** Number of ICMP packets with a bad checksum. */
128 	net_stats_t chkerr;
129 };
130 
131 /**
132  * @brief TCP statistics
133  */
134 struct net_stats_tcp {
135 	/** Amount of received and sent TCP application data. */
136 	struct net_stats_bytes bytes;
137 
138 	/** Amount of retransmitted data. */
139 	net_stats_t resent;
140 
141 	/** Number of dropped packets at the TCP layer. */
142 	net_stats_t drop;
143 
144 	/** Number of received TCP segments. */
145 	net_stats_t recv;
146 
147 	/** Number of sent TCP segments. */
148 	net_stats_t sent;
149 
150 	/** Number of dropped TCP segments. */
151 	net_stats_t seg_drop;
152 
153 	/** Number of TCP segments with a bad checksum. */
154 	net_stats_t chkerr;
155 
156 	/** Number of received TCP segments with a bad ACK number. */
157 	net_stats_t ackerr;
158 
159 	/** Number of received bad TCP RST (reset) segments. */
160 	net_stats_t rsterr;
161 
162 	/** Number of received TCP RST (reset) segments. */
163 	net_stats_t rst;
164 
165 	/** Number of retransmitted TCP segments. */
166 	net_stats_t rexmit;
167 
168 	/** Number of dropped connection attempts because too few connections
169 	 * were available.
170 	 */
171 	net_stats_t conndrop;
172 
173 	/** Number of connection attempts for closed ports, triggering a RST. */
174 	net_stats_t connrst;
175 };
176 
177 /**
178  * @brief UDP statistics
179  */
180 struct net_stats_udp {
181 	/** Number of dropped UDP segments. */
182 	net_stats_t drop;
183 
184 	/** Number of received UDP segments. */
185 	net_stats_t recv;
186 
187 	/** Number of sent UDP segments. */
188 	net_stats_t sent;
189 
190 	/** Number of UDP segments with a bad checksum. */
191 	net_stats_t chkerr;
192 };
193 
194 /**
195  * @brief IPv6 neighbor discovery statistics
196  */
197 struct net_stats_ipv6_nd {
198 	/** Number of dropped IPv6 neighbor discovery packets. */
199 	net_stats_t drop;
200 
201 	/** Number of received IPv6 neighbor discovery packets. */
202 	net_stats_t recv;
203 
204 	/** Number of sent IPv6 neighbor discovery packets. */
205 	net_stats_t sent;
206 };
207 
208 /**
209  * @brief IPv6 Path MTU Discovery statistics
210  */
211 struct net_stats_ipv6_pmtu {
212 	/** Number of dropped IPv6 PMTU packets. */
213 	net_stats_t drop;
214 
215 	/** Number of received IPv6 PMTU packets. */
216 	net_stats_t recv;
217 
218 	/** Number of sent IPv6 PMTU packets. */
219 	net_stats_t sent;
220 };
221 
222 /**
223  * @brief IPv4 Path MTU Discovery statistics
224  */
225 struct net_stats_ipv4_pmtu {
226 	/** Number of dropped IPv4 PMTU packets. */
227 	net_stats_t drop;
228 
229 	/** Number of received IPv4 PMTU packets. */
230 	net_stats_t recv;
231 
232 	/** Number of sent IPv4 PMTU packets. */
233 	net_stats_t sent;
234 };
235 
236 /**
237  * @brief IPv6 multicast listener daemon statistics
238  */
239 struct net_stats_ipv6_mld {
240 	/** Number of received IPv6 MLD queries. */
241 	net_stats_t recv;
242 
243 	/** Number of sent IPv6 MLD reports. */
244 	net_stats_t sent;
245 
246 	/** Number of dropped IPv6 MLD packets. */
247 	net_stats_t drop;
248 };
249 
250 /**
251  * @brief IPv4 IGMP daemon statistics
252  */
253 struct net_stats_ipv4_igmp {
254 	/** Number of received IPv4 IGMP queries */
255 	net_stats_t recv;
256 
257 	/** Number of sent IPv4 IGMP reports */
258 	net_stats_t sent;
259 
260 	/** Number of dropped IPv4 IGMP packets */
261 	net_stats_t drop;
262 };
263 
264 /**
265  * @brief DNS statistics
266  */
267 struct net_stats_dns {
268 	/** Number of received DNS queries */
269 	net_stats_t recv;
270 
271 	/** Number of sent DNS responses */
272 	net_stats_t sent;
273 
274 	/** Number of dropped DNS packets */
275 	net_stats_t drop;
276 };
277 
278 /**
279  * @brief Network packet transfer times for calculating average TX time
280  */
281 struct net_stats_tx_time {
282 	/** Sum of network packet transfer times. */
283 	uint64_t sum;
284 
285 	/** Number of network packets transferred. */
286 	net_stats_t count;
287 };
288 
289 /**
290  * @brief Network packet receive times for calculating average RX time
291  */
292 struct net_stats_rx_time {
293 	/** Sum of network packet receive times. */
294 	uint64_t sum;
295 
296 	/** Number of network packets received. */
297 	net_stats_t count;
298 };
299 
300 /** @cond INTERNAL_HIDDEN */
301 
302 #if NET_TC_TX_COUNT == 0
303 #define NET_TC_TX_STATS_COUNT 1
304 #else
305 #define NET_TC_TX_STATS_COUNT NET_TC_TX_COUNT
306 #endif
307 
308 #if NET_TC_RX_COUNT == 0
309 #define NET_TC_RX_STATS_COUNT 1
310 #else
311 #define NET_TC_RX_STATS_COUNT NET_TC_RX_COUNT
312 #endif
313 
314 /** @endcond */
315 
316 /**
317  * @brief Traffic class statistics
318  */
319 struct net_stats_tc {
320 	/** TX statistics for each traffic class */
321 	struct {
322 		/** Number of bytes sent for this traffic class */
323 		uint64_t bytes;
324 		/** Helper for calculating average TX time statistics */
325 		struct net_stats_tx_time tx_time;
326 #if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL)
327 		/** Detailed TX time statistics inside network stack */
328 		struct net_stats_tx_time
329 				tx_time_detail[NET_PKT_DETAIL_STATS_COUNT];
330 #endif
331 		/** Number of packets sent for this traffic class */
332 		net_stats_t pkts;
333 		/** Number of packets dropped for this traffic class */
334 		net_stats_t dropped;
335 		/** Priority of this traffic class */
336 		uint8_t priority;
337 	} sent[NET_TC_TX_STATS_COUNT];
338 
339 	/** RX statistics for each traffic class */
340 	struct {
341 		/** Number of bytes received for this traffic class */
342 		uint64_t bytes;
343 		/** Helper for calculating average RX time statistics */
344 		struct net_stats_rx_time rx_time;
345 #if defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
346 		/** Detailed RX time statistics inside network stack */
347 		struct net_stats_rx_time
348 				rx_time_detail[NET_PKT_DETAIL_STATS_COUNT];
349 #endif
350 		/** Number of packets received for this traffic class */
351 		net_stats_t pkts;
352 		/** Number of packets dropped for this traffic class */
353 		net_stats_t dropped;
354 		/** Priority of this traffic class */
355 		uint8_t priority;
356 	} recv[NET_TC_RX_STATS_COUNT];
357 };
358 
359 
360 /**
361  * @brief Power management statistics
362  */
363 struct net_stats_pm {
364 	/** Total suspend time */
365 	uint64_t overall_suspend_time;
366 	/** How many times we were suspended */
367 	net_stats_t suspend_count;
368 	/** How long the last suspend took */
369 	uint32_t last_suspend_time;
370 	/** Network interface last suspend start time */
371 	uint32_t start_time;
372 };
373 
374 /**
375  * @brief Network packet filter statistics
376  */
377 struct net_stats_pkt_filter {
378 	/** Network packet filter RX statistics */
379 	struct {
380 		/** Network packets dropped at network interface level */
381 		net_stats_t drop;
382 #if defined(CONFIG_NET_PKT_FILTER_IPV4_HOOK)
383 		/** IPv4 packets dropped at network interface level */
384 		net_stats_t ipv4_drop;
385 #endif
386 #if defined(CONFIG_NET_PKT_FILTER_IPV6_HOOK)
387 		/** IPv6 packets dropped at network interface level */
388 		net_stats_t ipv6_drop;
389 #endif
390 #if defined(CONFIG_NET_PKT_FILTER_LOCAL_IN_HOOK)
391 		/** Packets dropped at connection input */
392 		net_stats_t local_drop;
393 #endif
394 	} rx;
395 
396 	/** Network packet filter TX statistics */
397 	struct {
398 		/** Network packets dropped at network interface level */
399 		net_stats_t drop;
400 	} tx;
401 };
402 
403 /**
404  * @brief All network statistics in one struct.
405  */
406 struct net_stats {
407 	/**
408 	 * This calculates amount of data transferred through all the
409 	 * network interfaces.
410 	 */
411 	struct net_stats_bytes bytes;
412 
413 	/** Count of malformed packets or packets we do not have handler for */
414 	net_stats_t processing_error;
415 
416 	/** IP layer errors */
417 	struct net_stats_ip_errors ip_errors;
418 
419 #if defined(CONFIG_NET_STATISTICS_PKT_FILTER)
420 	struct net_stats_pkt_filter pkt_filter;
421 #endif
422 
423 #if defined(CONFIG_NET_STATISTICS_IPV6)
424 	/** IPv6 statistics */
425 	struct net_stats_ip ipv6;
426 #endif
427 
428 #if defined(CONFIG_NET_STATISTICS_IPV4)
429 	/** IPv4 statistics */
430 	struct net_stats_ip ipv4;
431 #endif
432 
433 #if defined(CONFIG_NET_STATISTICS_ICMP)
434 	/** ICMP statistics */
435 	struct net_stats_icmp icmp;
436 #endif
437 
438 #if defined(CONFIG_NET_STATISTICS_TCP)
439 	/** TCP statistics */
440 	struct net_stats_tcp tcp;
441 #endif
442 
443 #if defined(CONFIG_NET_STATISTICS_UDP)
444 	/** UDP statistics */
445 	struct net_stats_udp udp;
446 #endif
447 
448 #if defined(CONFIG_NET_STATISTICS_IPV6_ND)
449 	/** IPv6 neighbor discovery statistics */
450 	struct net_stats_ipv6_nd ipv6_nd;
451 #endif
452 
453 #if defined(CONFIG_NET_STATISTICS_IPV6_PMTU)
454 	/** IPv6 Path MTU Discovery statistics */
455 	struct net_stats_ipv6_pmtu ipv6_pmtu;
456 #endif
457 
458 #if defined(CONFIG_NET_STATISTICS_IPV4_PMTU)
459 	/** IPv4 Path MTU Discovery statistics */
460 	struct net_stats_ipv4_pmtu ipv4_pmtu;
461 #endif
462 
463 #if defined(CONFIG_NET_STATISTICS_MLD)
464 	/** IPv6 MLD statistics */
465 	struct net_stats_ipv6_mld ipv6_mld;
466 #endif
467 
468 #if defined(CONFIG_NET_STATISTICS_IGMP)
469 	/** IPv4 IGMP statistics */
470 	struct net_stats_ipv4_igmp ipv4_igmp;
471 #endif
472 
473 #if defined(CONFIG_NET_STATISTICS_DNS)
474 	/** DNS statistics */
475 	struct net_stats_dns dns;
476 #endif
477 
478 #if NET_TC_COUNT > 1
479 	/** Traffic class statistics */
480 	struct net_stats_tc tc;
481 #endif
482 
483 #if defined(CONFIG_NET_PKT_TXTIME_STATS)
484 	/** Network packet TX time statistics */
485 	struct net_stats_tx_time tx_time;
486 #endif
487 
488 #if defined(CONFIG_NET_PKT_RXTIME_STATS)
489 	/** Network packet RX time statistics */
490 	struct net_stats_rx_time rx_time;
491 #endif
492 
493 #if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL)
494 	/** Network packet TX time detail statistics */
495 	struct net_stats_tx_time tx_time_detail[NET_PKT_DETAIL_STATS_COUNT];
496 #endif
497 #if defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
498 	/** Network packet RX time detail statistics */
499 	struct net_stats_rx_time rx_time_detail[NET_PKT_DETAIL_STATS_COUNT];
500 #endif
501 
502 #if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
503 	/** Power management statistics */
504 	struct net_stats_pm pm;
505 #endif
506 };
507 
508 /**
509  * @brief Ethernet error statistics
510  */
511 struct net_stats_eth_errors {
512 	/** Number of RX length errors */
513 	net_stats_t rx_length_errors;
514 
515 	/** Number of RX overrun errors */
516 	net_stats_t rx_over_errors;
517 
518 	/** Number of RX CRC errors */
519 	net_stats_t rx_crc_errors;
520 
521 	/** Number of RX frame errors */
522 	net_stats_t rx_frame_errors;
523 
524 	/** Number of RX net_pkt allocation errors */
525 	net_stats_t rx_no_buffer_count;
526 
527 	/** Number of RX missed errors */
528 	net_stats_t rx_missed_errors;
529 
530 	/** Number of RX long length errors */
531 	net_stats_t rx_long_length_errors;
532 
533 	/** Number of RX short length errors */
534 	net_stats_t rx_short_length_errors;
535 
536 	/** Number of RX buffer align errors */
537 	net_stats_t rx_align_errors;
538 
539 	/** Number of RX DMA failed errors */
540 	net_stats_t rx_dma_failed;
541 
542 	/** Number of RX net_buf allocation errors */
543 	net_stats_t rx_buf_alloc_failed;
544 
545 	/** Number of TX aborted errors */
546 	net_stats_t tx_aborted_errors;
547 
548 	/** Number of TX carrier errors */
549 	net_stats_t tx_carrier_errors;
550 
551 	/** Number of TX FIFO errors */
552 	net_stats_t tx_fifo_errors;
553 
554 	/** Number of TX heartbeat errors */
555 	net_stats_t tx_heartbeat_errors;
556 
557 	/** Number of TX window errors */
558 	net_stats_t tx_window_errors;
559 
560 	/** Number of TX DMA failed errors */
561 	net_stats_t tx_dma_failed;
562 
563 	/** Number of uncorrected ECC errors */
564 	net_stats_t uncorr_ecc_errors;
565 
566 	/** Number of corrected ECC errors */
567 	net_stats_t corr_ecc_errors;
568 };
569 
570 /**
571  * @brief Ethernet flow control statistics
572  */
573 struct net_stats_eth_flow {
574 	/** Number of RX XON flow control */
575 	net_stats_t rx_flow_control_xon;
576 
577 	/** Number of RX XOFF flow control */
578 	net_stats_t rx_flow_control_xoff;
579 
580 	/** Number of TX XON flow control */
581 	net_stats_t tx_flow_control_xon;
582 
583 	/** Number of TX XOFF flow control */
584 	net_stats_t tx_flow_control_xoff;
585 };
586 
587 /**
588  * @brief Ethernet checksum statistics
589  */
590 struct net_stats_eth_csum {
591 	/** Number of good RX checksum offloading */
592 	net_stats_t rx_csum_offload_good;
593 
594 	/** Number of failed RX checksum offloading */
595 	net_stats_t rx_csum_offload_errors;
596 };
597 
598 /**
599  * @brief Ethernet hardware timestamp statistics
600  */
601 struct net_stats_eth_hw_timestamp {
602 	/** Number of RX hardware timestamp cleared */
603 	net_stats_t rx_hwtstamp_cleared;
604 
605 	/** Number of RX hardware timestamp timeout */
606 	net_stats_t tx_hwtstamp_timeouts;
607 
608 	/** Number of RX hardware timestamp skipped */
609 	net_stats_t tx_hwtstamp_skipped;
610 };
611 
612 #ifdef CONFIG_NET_STATISTICS_ETHERNET_VENDOR
613 /**
614  * @brief Ethernet vendor specific statistics
615  */
616 struct net_stats_eth_vendor {
617 	const char * const key; /**< Key name of vendor statistics */
618 	uint32_t value;         /**< Value of the statistics key */
619 };
620 #endif
621 
622 /**
623  * @brief All Ethernet specific statistics
624  */
625 struct net_stats_eth {
626 	/** Total number of bytes received and sent */
627 	struct net_stats_bytes bytes;
628 
629 	/** Total number of packets received and sent */
630 	struct net_stats_pkts pkts;
631 
632 	/** Total number of broadcast packets received and sent */
633 	struct net_stats_pkts broadcast;
634 
635 	/** Total number of multicast packets received and sent */
636 	struct net_stats_pkts multicast;
637 
638 	/** Total number of errors in RX and TX */
639 	struct net_stats_pkts errors;
640 
641 	/** Total number of errors in RX and TX */
642 	struct net_stats_eth_errors error_details;
643 
644 	/** Total number of flow control errors in RX and TX */
645 	struct net_stats_eth_flow flow_control;
646 
647 	/** Total number of checksum errors in RX and TX */
648 	struct net_stats_eth_csum csum;
649 
650 	/** Total number of hardware timestamp errors in RX and TX */
651 	struct net_stats_eth_hw_timestamp hw_timestamp;
652 
653 	/** Total number of collisions */
654 	net_stats_t collisions;
655 
656 	/** Total number of dropped TX packets */
657 	net_stats_t tx_dropped;
658 
659 	/** Total number of TX timeout errors */
660 	net_stats_t tx_timeout_count;
661 
662 	/** Total number of TX queue restarts */
663 	net_stats_t tx_restart_queue;
664 
665 	/** Total number of RX unknown protocol packets */
666 	net_stats_t unknown_protocol;
667 
668 #ifdef CONFIG_NET_STATISTICS_ETHERNET_VENDOR
669 	/** Array is terminated with an entry containing a NULL key */
670 	struct net_stats_eth_vendor *vendor;
671 #endif
672 };
673 
674 /**
675  * @brief All PPP specific statistics
676  */
677 struct net_stats_ppp {
678 	/** Total number of bytes received and sent */
679 	struct net_stats_bytes bytes;
680 
681 	/** Total number of packets received and sent */
682 	struct net_stats_pkts pkts;
683 
684 	/** Number of received and dropped PPP frames. */
685 	net_stats_t drop;
686 
687 	/** Number of received PPP frames with a bad checksum. */
688 	net_stats_t chkerr;
689 };
690 
691 /**
692  * @brief All Wi-Fi management statistics
693  */
694 struct net_stats_sta_mgmt {
695 	/** Number of received beacons */
696 	net_stats_t beacons_rx;
697 
698 	/** Number of missed beacons */
699 	net_stats_t beacons_miss;
700 };
701 
702 /**
703  * @brief All Wi-Fi specific statistics
704  */
705 struct net_stats_wifi {
706 	/** Total number of beacon errors */
707 	struct net_stats_sta_mgmt sta_mgmt;
708 
709 	/** Total number of bytes received and sent */
710 	struct net_stats_bytes bytes;
711 
712 	/** Total number of packets received and sent */
713 	struct net_stats_pkts pkts;
714 
715 	/** Total number of broadcast packets received and sent */
716 	struct net_stats_pkts broadcast;
717 
718 	/** Total number of multicast packets received and sent */
719 	struct net_stats_pkts multicast;
720 
721 	/** Total number of errors in RX and TX */
722 	struct net_stats_pkts errors;
723 
724 	/** Total number of unicast packets received and sent */
725 	struct net_stats_pkts unicast;
726 
727 	/** Total number of dropped packets at received and sent*/
728 	net_stats_t overrun_count;
729 };
730 
731 #if defined(CONFIG_NET_STATISTICS_USER_API)
732 /* Management part definitions */
733 
734 /** @cond INTERNAL_HIDDEN */
735 
736 #define NET_STATS_LAYER	NET_MGMT_LAYER_L3
737 #define NET_STATS_CODE		NET_MGMT_LAYER_CODE_STATS
738 #define NET_STATS_BASE		(NET_MGMT_LAYER(NET_STATS_LAYER) |	\
739 				 NET_MGMT_LAYER_CODE(NET_STATS_CODE))
740 
741 enum net_request_stats_cmd {
742 	NET_REQUEST_STATS_CMD_GET_ALL = 1,
743 	NET_REQUEST_STATS_CMD_GET_PROCESSING_ERROR,
744 	NET_REQUEST_STATS_CMD_GET_PKT_FILTER_DROP,
745 	NET_REQUEST_STATS_CMD_GET_BYTES,
746 	NET_REQUEST_STATS_CMD_GET_IP_ERRORS,
747 	NET_REQUEST_STATS_CMD_GET_IPV4,
748 	NET_REQUEST_STATS_CMD_GET_IPV6,
749 	NET_REQUEST_STATS_CMD_GET_IPV6_ND,
750 	NET_REQUEST_STATS_CMD_GET_IPV6_PMTU,
751 	NET_REQUEST_STATS_CMD_GET_IPV4_PMTU,
752 	NET_REQUEST_STATS_CMD_GET_ICMP,
753 	NET_REQUEST_STATS_CMD_GET_UDP,
754 	NET_REQUEST_STATS_CMD_GET_TCP,
755 	NET_REQUEST_STATS_CMD_GET_ETHERNET,
756 	NET_REQUEST_STATS_CMD_GET_PPP,
757 	NET_REQUEST_STATS_CMD_GET_PM,
758 	NET_REQUEST_STATS_CMD_GET_WIFI,
759 	NET_REQUEST_STATS_CMD_RESET_WIFI,
760 	NET_REQUEST_STATS_CMD_GET_VPN,
761 };
762 
763 /** @endcond */
764 
765 /** Request all network statistics */
766 #define NET_REQUEST_STATS_GET_ALL				\
767 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_ALL)
768 
769 /** Request all processing error statistics */
770 #define NET_REQUEST_STATS_GET_PROCESSING_ERROR				\
771 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_PROCESSING_ERROR)
772 
773 /** Request all pkt_filter drop statistics */
774 #define NET_REQUEST_STATS_GET_PKT_FILTER_DROP			\
775 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_PKT_FILTER_DROP)
776 
777 /** Request number of received and sent bytes */
778 #define NET_REQUEST_STATS_GET_BYTES				\
779 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_BYTES)
780 
781 /** Request IP error statistics */
782 #define NET_REQUEST_STATS_GET_IP_ERRORS				\
783 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IP_ERRORS)
784 
785 /** @cond INTERNAL_HIDDEN */
786 
787 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_ALL);
788 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PROCESSING_ERROR);
789 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_BYTES);
790 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IP_ERRORS);
791 
792 #if defined(CONFIG_NET_STATISTICS_PKT_FILTER)
793 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PKT_FILTER_DROP);
794 #endif /* CONFIG_NET_STATISTICS_PKT_FILTER */
795 
796 /** @endcond */
797 
798 #if defined(CONFIG_NET_STATISTICS_IPV4)
799 /** Request IPv4 statistics */
800 #define NET_REQUEST_STATS_GET_IPV4				\
801 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IPV4)
802 
803 /** @cond INTERNAL_HIDDEN */
804 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV4);
805 /** @endcond */
806 #endif /* CONFIG_NET_STATISTICS_IPV4 */
807 
808 #if defined(CONFIG_NET_STATISTICS_IPV6)
809 /** Request IPv6 statistics */
810 #define NET_REQUEST_STATS_GET_IPV6				\
811 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IPV6)
812 
813 /** @cond INTERNAL_HIDDEN */
814 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6);
815 /** @endcond */
816 #endif /* CONFIG_NET_STATISTICS_IPV6 */
817 
818 #if defined(CONFIG_NET_STATISTICS_IPV6_ND)
819 /** Request IPv6 neighbor discovery statistics */
820 #define NET_REQUEST_STATS_GET_IPV6_ND				\
821 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IPV6_ND)
822 
823 /** @cond INTERNAL_HIDDEN */
824 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6_ND);
825 /** @endcond */
826 #endif /* CONFIG_NET_STATISTICS_IPV6_ND */
827 
828 #if defined(CONFIG_NET_STATISTICS_IPV6_PMTU)
829 /** Request IPv6 Path MTU Discovery statistics */
830 #define NET_REQUEST_STATS_GET_IPV6_PMTU				\
831 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IPV6_PMTU)
832 
833 /** @cond INTERNAL_HIDDEN */
834 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6_PMTU);
835 /** @endcond */
836 #endif /* CONFIG_NET_STATISTICS_IPV6_PMTU */
837 
838 #if defined(CONFIG_NET_STATISTICS_IPV4_PMTU)
839 /** Request IPv4 Path MTU Discovery statistics */
840 #define NET_REQUEST_STATS_GET_IPV4_PMTU				\
841 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IPV4_PMTU)
842 
843 /** @cond INTERNAL_HIDDEN */
844 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV4_PMTU);
845 /** @endcond */
846 #endif /* CONFIG_NET_STATISTICS_IPV4_PMTU */
847 
848 #if defined(CONFIG_NET_STATISTICS_ICMP)
849 /** Request ICMPv4 and ICMPv6 statistics */
850 #define NET_REQUEST_STATS_GET_ICMP				\
851 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_ICMP)
852 
853 /** @cond INTERNAL_HIDDEN */
854 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_ICMP);
855 /** @endcond */
856 #endif /* CONFIG_NET_STATISTICS_ICMP */
857 
858 #if defined(CONFIG_NET_STATISTICS_UDP)
859 /** Request UDP statistics */
860 #define NET_REQUEST_STATS_GET_UDP				\
861 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_UDP)
862 
863 /** @cond INTERNAL_HIDDEN */
864 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_UDP);
865 /** @endcond */
866 #endif /* CONFIG_NET_STATISTICS_UDP */
867 
868 #if defined(CONFIG_NET_STATISTICS_TCP)
869 /** Request TCP statistics */
870 #define NET_REQUEST_STATS_GET_TCP				\
871 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_TCP)
872 
873 /** @cond INTERNAL_HIDDEN */
874 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_TCP);
875 /** @endcond */
876 #endif /* CONFIG_NET_STATISTICS_TCP */
877 
878 #if defined(CONFIG_NET_STATISTICS_ETHERNET)
879 /** Request Ethernet statistics */
880 #define NET_REQUEST_STATS_GET_ETHERNET				\
881 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_ETHERNET)
882 
883 /** @cond INTERNAL_HIDDEN */
884 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_ETHERNET);
885 /** @endcond */
886 #endif /* CONFIG_NET_STATISTICS_ETHERNET */
887 
888 #if defined(CONFIG_NET_STATISTICS_PPP)
889 /** Request PPP statistics */
890 #define NET_REQUEST_STATS_GET_PPP				\
891 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_PPP)
892 
893 /** @cond INTERNAL_HIDDEN */
894 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PPP);
895 /** @endcond */
896 #endif /* CONFIG_NET_STATISTICS_PPP */
897 
898 #if defined(CONFIG_NET_STATISTICS_VPN)
899 /** Request VPN statistics */
900 #define NET_REQUEST_STATS_GET_VPN				\
901 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_VPN)
902 
903 /** @cond INTERNAL_HIDDEN */
904 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_VPN);
905 /** @endcond */
906 #endif /* CONFIG_NET_STATISTICS_VPN */
907 
908 #endif /* CONFIG_NET_STATISTICS_USER_API */
909 
910 #if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
911 /** Request network power management statistics */
912 #define NET_REQUEST_STATS_GET_PM				\
913 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_PM)
914 
915 /** @cond INTERNAL_HIDDEN */
916 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PM);
917 /** @endcond */
918 #endif /* CONFIG_NET_STATISTICS_POWER_MANAGEMENT */
919 
920 #if defined(CONFIG_NET_STATISTICS_WIFI)
921 /** Request Wi-Fi statistics */
922 #define NET_REQUEST_STATS_GET_WIFI				\
923 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_WIFI)
924 
925 /** @cond INTERNAL_HIDDEN */
926 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_WIFI);
927 /** @endcond */
928 
929 /** Reset Wi-Fi statistics*/
930 #define NET_REQUEST_STATS_RESET_WIFI                              \
931 	(NET_STATS_BASE | NET_REQUEST_STATS_CMD_RESET_WIFI)
932 
933 /** @cond INTERNAL_HIDDEN */
934 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_RESET_WIFI);
935 /** @endcond */
936 #endif /* CONFIG_NET_STATISTICS_WIFI */
937 
938 #define NET_STATS_GET_METRIC_NAME(_name) _name
939 #define NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx) net_stats_##dev_id##_##sfx##_collector
940 #define NET_STATS_GET_VAR(dev_id, sfx, var) zephyr_net_##var
941 #define NET_STATS_GET_INSTANCE(dev_id, sfx, _not_used) STRINGIFY(_##dev_id##_##sfx)
942 
943 /* The label value is set to be the network interface name. Note that we skip
944  * the first character (_) when setting the label value. This can be changed
945  * if there is a way to token paste the instance name without the prefix character.
946  * Note also that the below macros have some parameters that are not used atm.
947  */
948 #define NET_STATS_PROMETHEUS_COUNTER_DEFINE(_desc, _labelval, _not_used,	\
949 					    _collector, _name, _stat_var_ptr)	\
950 	static PROMETHEUS_COUNTER_DEFINE(					\
951 		NET_STATS_GET_METRIC_NAME(_name),				\
952 		_desc, ({ .key = "nic", .value = &_labelval[1] }),		\
953 		&(_collector), _stat_var_ptr)
954 
955 #define NET_STATS_PROMETHEUS_GAUGE_DEFINE(_desc,  _labelval, _not_used,		\
956 					  _collector, _name, _stat_var_ptr)	\
957 	static PROMETHEUS_GAUGE_DEFINE(						\
958 		NET_STATS_GET_METRIC_NAME(_name),				\
959 		_desc, ({ .key = "nic", .value = &_labelval[1] }),		\
960 		&(_collector), _stat_var_ptr)
961 
962 #define NET_STATS_PROMETHEUS_SUMMARY_DEFINE(_desc,  _labelval, _not_used,	\
963 					    _collector, _name, _stat_var_ptr)	\
964 	static PROMETHEUS_SUMMARY_DEFINE(					\
965 		NET_STATS_GET_METRIC_NAME(_name),				\
966 		_desc, ({ .key = "nic", .value = &_labelval[1] }),		\
967 		&(_collector), _stat_var_ptr)
968 
969 #define NET_STATS_PROMETHEUS_HISTOGRAM_DEFINE(_desc, _labelval, _not_used,	\
970 					      _collector, _name, _stat_var_ptr)	\
971 	static PROMETHEUS_HISTOGRAM_DEFINE(					\
972 		NET_STATS_GET_METRIC_NAME(_name),				\
973 		_desc, ({ .key = "nic", .value = &_labelval[1] }),		\
974 		&(_collector), _stat_var_ptr)
975 
976 /* IPv6 layer statistics */
977 #if defined(CONFIG_NET_STATISTICS_IPV6)
978 #define NET_STATS_PROMETHEUS_IPV6(iface, dev_id, sfx)			\
979 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
980 		"IPv6 packets sent",					\
981 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_sent),		\
982 		"packet_count",						\
983 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
984 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_sent),		\
985 		&(iface)->stats.ipv6.sent);				\
986 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
987 		"IPv6 packets received",				\
988 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_recv),		\
989 		"packet_count",						\
990 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
991 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_recv),		\
992 		&(iface)->stats.ipv6.recv);				\
993 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
994 		"IPv6 packets dropped",					\
995 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_drop),		\
996 		"packet_count",						\
997 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
998 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_drop),		\
999 		&(iface)->stats.ipv6.drop);				\
1000 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1001 		"IPv6 packets forwarded",				\
1002 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_forward),	\
1003 		"packet_count",						\
1004 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1005 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_forwarded),		\
1006 		&(iface)->stats.ipv6.forwarded)
1007 #else
1008 #define NET_STATS_PROMETHEUS_IPV6(iface, dev_id, sfx)
1009 #endif
1010 
1011 /* IPv4 layer statistics */
1012 #if defined(CONFIG_NET_STATISTICS_IPV4)
1013 #define NET_STATS_PROMETHEUS_IPV4(iface, dev_id, sfx)			\
1014 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1015 		"IPv4 packets sent",					\
1016 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_sent),		\
1017 		"packet_count",						\
1018 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1019 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_sent),		\
1020 		&(iface)->stats.ipv4.sent);				\
1021 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1022 		"IPv4 packets received",				\
1023 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_recv),		\
1024 		"packet_count",						\
1025 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1026 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_recv),		\
1027 		&(iface)->stats.ipv4.recv);				\
1028 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1029 		"IPv4 packets dropped",					\
1030 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_drop),		\
1031 		"packet_count",						\
1032 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1033 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_drop),		\
1034 		&(iface)->stats.ipv4.drop);				\
1035 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1036 		"IPv4 packets forwarded",				\
1037 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_forwarded),	\
1038 		"packet_count",						\
1039 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1040 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_forwarded),		\
1041 		&(iface)->stats.ipv4.forwarded)
1042 #else
1043 #define NET_STATS_PROMETHEUS_IPV4(iface, dev_id, sfx)
1044 #endif
1045 
1046 /* ICMP layer statistics */
1047 #if defined(CONFIG_NET_STATISTICS_ICMP)
1048 #define NET_STATS_PROMETHEUS_ICMP(iface, dev_id, sfx)			\
1049 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1050 		"ICMP packets sent",					\
1051 		NET_STATS_GET_INSTANCE(dev_id, sfx, icmp_sent),		\
1052 		"packet_count",						\
1053 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1054 		NET_STATS_GET_VAR(dev_id, sfx, icmp_sent),		\
1055 		&(iface)->stats.icmp.sent);				\
1056 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1057 		"ICMP packets received",				\
1058 		NET_STATS_GET_INSTANCE(dev_id, sfx, icmp_recv),		\
1059 		"packet_count",						\
1060 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1061 		NET_STATS_GET_VAR(dev_id, sfx, icmp_recv),		\
1062 		&(iface)->stats.icmp.recv);				\
1063 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1064 		"ICMP packets dropped",					\
1065 		NET_STATS_GET_INSTANCE(dev_id, sfx, icmp_drop),		\
1066 		"packet_count",						\
1067 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1068 		NET_STATS_GET_VAR(dev_id, sfx, icmp_drop),		\
1069 		&(iface)->stats.icmp.drop);				\
1070 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1071 		"ICMP packets checksum error",				\
1072 		NET_STATS_GET_INSTANCE(dev_id, sfx, icmp_chkerr),	\
1073 		"packet_count",						\
1074 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1075 		NET_STATS_GET_VAR(dev_id, sfx, icmp_chkerr),		\
1076 		&(iface)->stats.icmp.chkerr);				\
1077 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1078 		"ICMP packets type error",				\
1079 		NET_STATS_GET_INSTANCE(dev_id, sfx, icmp_typeerr),	\
1080 		"packet_count",						\
1081 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1082 		NET_STATS_GET_VAR(dev_id, sfx, icmp_typeerr),		\
1083 		&(iface)->stats.icmp.typeerr)
1084 #else
1085 #define NET_STATS_PROMETHEUS_ICMP(iface, dev_id, sfx)
1086 #endif
1087 
1088 /* UDP layer statistics */
1089 #if defined(CONFIG_NET_STATISTICS_UDP)
1090 #define NET_STATS_PROMETHEUS_UDP(iface, dev_id, sfx)			\
1091 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1092 		"UDP packets sent",					\
1093 		NET_STATS_GET_INSTANCE(dev_id, sfx, udp_sent),		\
1094 		"packet_count",						\
1095 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1096 		NET_STATS_GET_VAR(dev_id, sfx, udp_sent),		\
1097 		&(iface)->stats.udp.sent);				\
1098 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1099 		"UDP packets received",					\
1100 		NET_STATS_GET_INSTANCE(dev_id, sfx, udp_recv),		\
1101 		"packet_count",						\
1102 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1103 		NET_STATS_GET_VAR(dev_id, sfx, udp_recv),		\
1104 		&(iface)->stats.udp.recv);				\
1105 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1106 		"UDP packets dropped",					\
1107 		NET_STATS_GET_INSTANCE(dev_id, sfx, udp_drop),		\
1108 		"packet_count",						\
1109 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1110 		NET_STATS_GET_VAR(dev_id, sfx, udp_drop),		\
1111 		&(iface)->stats.udp.drop);				\
1112 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1113 		"UDP packets checksum error",				\
1114 		NET_STATS_GET_INSTANCE(dev_id, sfx, udp_chkerr),	\
1115 		"packet_count",						\
1116 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1117 		NET_STATS_GET_VAR(dev_id, sfx, udp_chkerr),		\
1118 		&(iface)->stats.udp.chkerr)
1119 #else
1120 #define NET_STATS_PROMETHEUS_UDP(iface, dev_id, sfx)
1121 #endif
1122 
1123 /* TCP layer statistics */
1124 #if defined(CONFIG_NET_STATISTICS_TCP)
1125 #define NET_STATS_PROMETHEUS_TCP(iface, dev_id, sfx)			\
1126 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1127 		"TCP bytes sent",					\
1128 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_bytes_sent),	\
1129 		"byte_count",						\
1130 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1131 		NET_STATS_GET_VAR(dev_id, sfx, tcp_bytes_sent),		\
1132 		&(iface)->stats.tcp.bytes.sent);			\
1133 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1134 		"TCP bytes received",					\
1135 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_bytes_recv),	\
1136 		"byte_count",						\
1137 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1138 		NET_STATS_GET_VAR(dev_id, sfx, tcp_bytes_recv),		\
1139 		&(iface)->stats.tcp.bytes.received);			\
1140 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1141 		"TCP bytes resent",					\
1142 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_bytes_resent),	\
1143 		"byte_count",						\
1144 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1145 		NET_STATS_GET_VAR(dev_id, sfx, tcp_bytes_resent),	\
1146 		&(iface)->stats.tcp.resent);				\
1147 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1148 		"TCP packets sent",					\
1149 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_sent),		\
1150 		"packet_count",						\
1151 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1152 		NET_STATS_GET_VAR(dev_id, sfx, tcp_sent),		\
1153 		&(iface)->stats.tcp.sent);				\
1154 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1155 		"TCP packets received",					\
1156 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_recv),		\
1157 		"packet_count",						\
1158 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1159 		NET_STATS_GET_VAR(dev_id, sfx, tcp_recv),		\
1160 		&(iface)->stats.tcp.recv);				\
1161 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1162 		"TCP packets dropped",					\
1163 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_drop),		\
1164 		"packet_count",						\
1165 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1166 		NET_STATS_GET_VAR(dev_id, sfx, tcp_drop),		\
1167 		&(iface)->stats.tcp.drop);				\
1168 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1169 		"TCP packets checksum error",				\
1170 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_chkerr),	\
1171 		"packet_count",						\
1172 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1173 		NET_STATS_GET_VAR(dev_id, sfx, tcp_chkerr),		\
1174 		&(iface)->stats.tcp.chkerr);				\
1175 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1176 		"TCP packets ack error",				\
1177 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_ackerr),	\
1178 		"packet_count",						\
1179 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1180 		NET_STATS_GET_VAR(dev_id, sfx, tcp_ackerr),		\
1181 		&(iface)->stats.tcp.ackerr);				\
1182 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1183 		"TCP packets reset error",				\
1184 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_rsterr),	\
1185 		"packet_count",						\
1186 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1187 		NET_STATS_GET_VAR(dev_id, sfx, tcp_rsterr),		\
1188 		&(iface)->stats.tcp.rsterr);				\
1189 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1190 		"TCP packets retransmitted",				\
1191 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_rexmit),	\
1192 		"packet_count",						\
1193 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1194 		NET_STATS_GET_VAR(dev_id, sfx, tcp_rexmit),		\
1195 		&(iface)->stats.tcp.rexmit);				\
1196 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1197 		"TCP reset received",					\
1198 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_rst_recv),	\
1199 		"packet_count",						\
1200 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1201 		NET_STATS_GET_VAR(dev_id, sfx, tcp_rst),		\
1202 		&(iface)->stats.tcp.rst);				\
1203 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1204 		"TCP connection drop",					\
1205 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_conndrop),	\
1206 		"packet_count",						\
1207 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1208 		NET_STATS_GET_VAR(dev_id, sfx, tcp_conndrop),		\
1209 		&(iface)->stats.tcp.conndrop);				\
1210 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1211 		"TCP connection reset",					\
1212 		NET_STATS_GET_INSTANCE(dev_id, sfx, tcp_connrst),	\
1213 		"packet_count",						\
1214 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1215 		NET_STATS_GET_VAR(dev_id, sfx, tcp_connrst),		\
1216 		&(iface)->stats.tcp.connrst)
1217 #else
1218 #define NET_STATS_PROMETHEUS_TCP(iface, dev_id, sfx)
1219 #endif
1220 
1221 /* IPv6 Neighbor Discovery statistics */
1222 #if defined(CONFIG_NET_STATISTICS_IPV6_ND)
1223 #define NET_STATS_PROMETHEUS_IPV6_ND(iface, dev_id, sfx)		\
1224 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1225 		"IPv6 ND packets sent",					\
1226 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_nd_sent),	\
1227 		"packet_count",						\
1228 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1229 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_nd_sent),		\
1230 		&(iface)->stats.ipv6_nd.sent);				\
1231 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1232 		"IPv6 ND packets received",				\
1233 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_nd_recv),	\
1234 		"packet_count",						\
1235 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1236 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_nd_recv),		\
1237 		&(iface)->stats.ipv6_nd.recv);				\
1238 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1239 		"IPv6 ND packets dropped",				\
1240 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_nd_drop),	\
1241 		"packet_count",						\
1242 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1243 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_nd_drop),		\
1244 		&(iface)->stats.ipv6_nd.drop)
1245 #else
1246 #define NET_STATS_PROMETHEUS_IPV6_ND(iface, dev_id, sfx)
1247 #endif
1248 
1249 /* IPv6 Path MTU Discovery statistics */
1250 #if defined(CONFIG_NET_STATISTICS_IPV6_PMTU)
1251 #define NET_STATS_PROMETHEUS_IPV6_PMTU(iface, dev_id, sfx)		\
1252 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1253 		"IPv6 PMTU packets sent",				\
1254 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_pmtu_sent),	\
1255 		"packet_count",						\
1256 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1257 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_pmtu_sent),		\
1258 		&(iface)->stats.ipv6_pmtu.sent);			\
1259 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1260 		"IPv6 PMTU packets received",				\
1261 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_pmtu_recv),	\
1262 		"packet_count",						\
1263 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1264 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_pmtu_recv),		\
1265 		&(iface)->stats.ipv6_pmtu.recv);			\
1266 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1267 		"IPv6 PMTU packets dropped",				\
1268 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_pmtu_drop),	\
1269 		"packet_count",						\
1270 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1271 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_pmtu_drop),		\
1272 		&(iface)->stats.ipv6_pmtu.drop)
1273 #else
1274 #define NET_STATS_PROMETHEUS_IPV6_PMTU(iface, dev_id, sfx)
1275 #endif
1276 
1277 /* IPv4 Path MTU Discovery statistics */
1278 #if defined(CONFIG_NET_STATISTICS_IPV4_PMTU)
1279 #define NET_STATS_PROMETHEUS_IPV4_PMTU(iface, dev_id, sfx)		\
1280 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1281 		"IPv4 PMTU packets sent",				\
1282 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_pmtu_sent),	\
1283 		"packet_count",						\
1284 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1285 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_pmtu_sent),		\
1286 		&(iface)->stats.ipv4_pmtu.sent);			\
1287 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1288 		"IPv4 PMTU packets received",				\
1289 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_pmtu_recv),	\
1290 		"packet_count",						\
1291 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1292 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_pmtu_recv),		\
1293 		&(iface)->stats.ipv4_pmtu.recv);			\
1294 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1295 		"IPv4 PMTU packets dropped",				\
1296 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_pmtu_drop),	\
1297 		"packet_count",						\
1298 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1299 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_pmtu_drop),		\
1300 		&(iface)->stats.ipv4_pmtu.drop)
1301 #else
1302 #define NET_STATS_PROMETHEUS_IPV4_PMTU(iface, dev_id, sfx)
1303 #endif
1304 
1305 /* IPv6 Multicast Listener Discovery statistics */
1306 #if defined(CONFIG_NET_STATISTICS_MLD)
1307 #define NET_STATS_PROMETHEUS_MLD(iface, dev_id, sfx)			\
1308 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1309 		"IPv6 MLD packets sent",				\
1310 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_mld_sent),	\
1311 		"packet_count",						\
1312 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1313 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_mld_sent),		\
1314 		&(iface)->stats.ipv6_mld.sent);				\
1315 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1316 		"IPv6 MLD packets received",				\
1317 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_mld_recv),	\
1318 		"packet_count",						\
1319 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1320 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_mld_recv),		\
1321 		&(iface)->stats.ipv6_mld.recv);				\
1322 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1323 		"IPv6 MLD packets dropped",				\
1324 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv6_mld_drop),	\
1325 		"packet_count",						\
1326 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1327 		NET_STATS_GET_VAR(dev_id, sfx, ipv6_mld_drop),		\
1328 		&(iface)->stats.ipv6_mld.drop)
1329 #else
1330 #define NET_STATS_PROMETHEUS_MLD(iface, dev_id, sfx)
1331 #endif
1332 
1333 /* IPv4 IGMP statistics */
1334 #if defined(CONFIG_NET_STATISTICS_IGMP)
1335 #define NET_STATS_PROMETHEUS_IGMP(iface, dev_id, sfx)			\
1336 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1337 		"IPv4 IGMP packets sent",				\
1338 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_igmp_sent),	\
1339 		"packet_count",						\
1340 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1341 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_igmp_sent),		\
1342 		&(iface)->stats.ipv4_igmp.sent);			\
1343 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1344 		"IPv4 IGMP packets received",				\
1345 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_igmp_recv),	\
1346 		"packet_count",						\
1347 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1348 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_igmp_recv),		\
1349 		&(iface)->stats.ipv4_igmp.recv);			\
1350 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1351 		"IPv4 IGMP packets dropped",				\
1352 		NET_STATS_GET_INSTANCE(dev_id, sfx, ipv4_igmp_drop),	\
1353 		"packet_count",						\
1354 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1355 		NET_STATS_GET_VAR(dev_id, sfx, ipv4_igmp_drop),		\
1356 		&(iface)->stats.ipv4_igmp.drop)
1357 #else
1358 #define NET_STATS_PROMETHEUS_IGMP(iface, dev_id, sfx)
1359 #endif
1360 
1361 /* DNS statistics */
1362 #if defined(CONFIG_NET_STATISTICS_DNS)
1363 #define NET_STATS_PROMETHEUS_DNS(iface, dev_id, sfx)			\
1364 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1365 		"DNS packets sent",					\
1366 		NET_STATS_GET_INSTANCE(dev_id, sfx, dns_sent),		\
1367 		"packet_count",						\
1368 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1369 		NET_STATS_GET_VAR(dev_id, sfx, dns_sent),		\
1370 		&(iface)->stats.dns.sent);				\
1371 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1372 		"DNS packets received",					\
1373 		NET_STATS_GET_INSTANCE(dev_id, sfx, dns_recv),		\
1374 		"packet_count",						\
1375 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1376 		NET_STATS_GET_VAR(dev_id, sfx, dns_recv),		\
1377 		&(iface)->stats.dns.recv);				\
1378 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1379 		"DNS packets dropped",					\
1380 		NET_STATS_GET_INSTANCE(dev_id, sfx, dns_drop),		\
1381 		"packet_count",						\
1382 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1383 		NET_STATS_GET_VAR(dev_id, sfx, dns_drop),		\
1384 		&(iface)->stats.dns.drop)
1385 #else
1386 #define NET_STATS_PROMETHEUS_DNS(iface, dev_id, sfx)
1387 #endif
1388 
1389 /* TX time statistics */
1390 #if defined(CONFIG_NET_PKT_TXTIME_STATS)
1391 #define NET_STATS_PROMETHEUS_TX_TIME(iface, dev_id, sfx)		\
1392 	NET_STATS_PROMETHEUS_SUMMARY_DEFINE(				\
1393 		"TX time in microseconds",				\
1394 		NET_STATS_GET_INSTANCE(dev_id, sfx, tx_time),		\
1395 		"time",							\
1396 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1397 		NET_STATS_GET_VAR(dev_id, sfx, tx_time),		\
1398 		&(iface)->stats.tx_time)
1399 #else
1400 #define NET_STATS_PROMETHEUS_TX_TIME(iface, dev_id, sfx)
1401 #endif
1402 
1403 /* RX time statistics */
1404 #if defined(CONFIG_NET_PKT_RXTIME_STATS)
1405 #define NET_STATS_PROMETHEUS_RX_TIME(iface, dev_id, sfx)		\
1406 	NET_STATS_PROMETHEUS_SUMMARY_DEFINE(				\
1407 		"RX time in microseconds",				\
1408 		NET_STATS_GET_INSTANCE(dev_id, sfx, rx_time),		\
1409 		"time",							\
1410 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1411 		NET_STATS_GET_VAR(dev_id, sfx, rx_time),		\
1412 		&(iface)->stats.rx_time)
1413 #else
1414 #define NET_STATS_PROMETHEUS_RX_TIME(iface, dev_id, sfx)
1415 #endif
1416 
1417 #define NET_STATS_PROMETHEUS_PKT_FILTER_IPV4(iface, dev_id, sfx)	\
1418 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1419 		"Packet filter RX IPv4 drop",				\
1420 		NET_STATS_GET_INSTANCE(dev_id, sfx, pkt_filter_rx_ipv4_drop), \
1421 		"packet_count",						\
1422 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1423 		NET_STATS_GET_VAR(dev_id, sfx, pkt_filter_rx_ipv4_drop),\
1424 		&(iface)->stats.pkt_filter.rx.ipv4_drop);
1425 
1426 #define NET_STATS_PROMETHEUS_PKT_FILTER_IPV6(iface, dev_id, sfx)	\
1427 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1428 		"Packet filter RX IPv6 drop",				\
1429 		NET_STATS_GET_INSTANCE(dev_id, sfx, pkt_filter_rx_ipv6_drop), \
1430 		"packet_count",						\
1431 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1432 		NET_STATS_GET_VAR(dev_id, sfx, pkt_filter_rx_ipv6_drop),\
1433 		&(iface)->stats.pkt_filter.rx.ipv6_drop);
1434 
1435 #define NET_STATS_PROMETHEUS_PKT_FILTER_LOCAL(iface, dev_id, sfx)	\
1436 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1437 		"Packet filter RX local drop",				\
1438 		NET_STATS_GET_INSTANCE(dev_id, sfx, pkt_filter_rx_local_drop), \
1439 		"packet_count",						\
1440 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1441 		NET_STATS_GET_VAR(dev_id, sfx, pkt_filter_rx_local_drop),\
1442 		&(iface)->stats.pkt_filter.rx.local_drop);
1443 
1444 #define NET_STATS_PROMETHEUS_PKT_FILTER(iface, dev_id, sfx)		\
1445 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1446 		"Packet filter RX drop",				\
1447 		NET_STATS_GET_INSTANCE(dev_id, sfx, pkt_filter_rx_drop),\
1448 		"packet_count",						\
1449 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1450 		NET_STATS_GET_VAR(dev_id, sfx, pkt_filter_rx_drop),	\
1451 		&(iface)->stats.pkt_filter.rx.drop);			\
1452 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1453 		"Packet filter TX drop",				\
1454 		NET_STATS_GET_INSTANCE(dev_id, sfx, pkt_filter_tx_drop),\
1455 		"packet_count",						\
1456 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1457 		NET_STATS_GET_VAR(dev_id, sfx, pkt_filter_tx_drop),	\
1458 		&(iface)->stats.pkt_filter.tx.drop);			\
1459 	IF_ENABLED(CONFIG_NET_PKT_FILTER_IPV4_HOOK,			\
1460 		   (NET_STATS_PROMETHEUS_PKT_FILTER_IPV4(iface, dev_id, sfx))) \
1461 	IF_ENABLED(CONFIG_NET_PKT_FILTER_IPV6_HOOK,			\
1462 		   (NET_STATS_PROMETHEUS_PKT_FILTER_IPV6(iface, dev_id, sfx))) \
1463 	IF_ENABLED(CONFIG_NET_PKT_FILTER_LOCAL_IN_HOOK,			\
1464 		   (NET_STATS_PROMETHEUS_PKT_FILTER_LOCAL(iface, dev_id, sfx)))
1465 
1466 /* Per network interface statistics via Prometheus */
1467 #define NET_STATS_PROMETHEUS(iface, dev_id, sfx)			\
1468 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1469 		"Processing error",					\
1470 		NET_STATS_GET_INSTANCE(dev_id, sfx, process_error),	\
1471 		"error_count",						\
1472 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1473 		NET_STATS_GET_VAR(dev_id, sfx, processing_error),	\
1474 		&(iface)->stats.processing_error);			\
1475 	IF_ENABLED(CONFIG_NET_STATISTICS_PKT_FILTER,			\
1476 		   (NET_STATS_PROMETHEUS_PKT_FILTER(iface, dev_id, sfx))) \
1477 	/* IP layer error statistics */					\
1478 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1479 		"IP proto error",					\
1480 		NET_STATS_GET_INSTANCE(dev_id, sfx, ip_proto_error),	\
1481 		"error_count",						\
1482 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1483 		NET_STATS_GET_VAR(dev_id, sfx, ip_errors_protoerr),	\
1484 		&(iface)->stats.ip_errors.protoerr);			\
1485 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1486 		"IP version/header len error",				\
1487 		NET_STATS_GET_INSTANCE(dev_id, sfx, ip_vhl_error),	\
1488 		"error_count",						\
1489 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1490 		NET_STATS_GET_VAR(dev_id, sfx, ip_errors_vhlerr),	\
1491 		&(iface)->stats.ip_errors.vhlerr);			\
1492 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1493 		"IP header len error (high byte)",			\
1494 		NET_STATS_GET_INSTANCE(dev_id, sfx, ip_hblen_error),	\
1495 		"error_count",						\
1496 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1497 		NET_STATS_GET_VAR(dev_id, sfx, ip_errors_hblenerr),	\
1498 		&(iface)->stats.ip_errors.hblenerr);			\
1499 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1500 		"IP header len error (low byte)",			\
1501 		NET_STATS_GET_INSTANCE(dev_id, sfx, ip_lblen_error),	\
1502 		"error_count",						\
1503 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1504 		NET_STATS_GET_VAR(dev_id, sfx, ip_errors_lblenerr),	\
1505 		&(iface)->stats.ip_errors.lblenerr);			\
1506 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1507 		"IP fragment error",					\
1508 		NET_STATS_GET_INSTANCE(dev_id, sfx, ip_frag_error),	\
1509 		"error_count",						\
1510 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1511 		NET_STATS_GET_VAR(dev_id, sfx, ip_errors_fragerr),	\
1512 		&(iface)->stats.ip_errors.fragerr);			\
1513 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1514 		"IP checksum error",					\
1515 		NET_STATS_GET_INSTANCE(dev_id, sfx, ip_chk_error),	\
1516 		"error_count",						\
1517 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1518 		NET_STATS_GET_VAR(dev_id, sfx, ip_errors_chkerr),	\
1519 		&(iface)->stats.ip_errors.chkerr);			\
1520 	/* General network statistics */				\
1521 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1522 		"Bytes received",					\
1523 		NET_STATS_GET_INSTANCE(dev_id, sfx, bytes_recv),	\
1524 		"byte_count",						\
1525 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1526 		NET_STATS_GET_VAR(dev_id, sfx, bytes_recv),		\
1527 		&(iface)->stats.bytes.received);			\
1528 	NET_STATS_PROMETHEUS_COUNTER_DEFINE(				\
1529 		"Bytes sent",						\
1530 		NET_STATS_GET_INSTANCE(dev_id, sfx, bytes_sent),	\
1531 		"byte_count",						\
1532 		NET_STATS_GET_COLLECTOR_NAME(dev_id, sfx),		\
1533 		NET_STATS_GET_VAR(dev_id, sfx, bytes_sent),		\
1534 		&(iface)->stats.bytes.sent);				\
1535 	NET_STATS_PROMETHEUS_IPV6(iface, dev_id, sfx);			\
1536 	NET_STATS_PROMETHEUS_IPV4(iface, dev_id, sfx);			\
1537 	NET_STATS_PROMETHEUS_ICMP(iface, dev_id, sfx);			\
1538 	NET_STATS_PROMETHEUS_UDP(iface, dev_id, sfx);			\
1539 	NET_STATS_PROMETHEUS_TCP(iface, dev_id, sfx);			\
1540 	NET_STATS_PROMETHEUS_IPV6_ND(iface, dev_id, sfx);		\
1541 	NET_STATS_PROMETHEUS_IPV6_PMTU(iface, dev_id, sfx);		\
1542 	NET_STATS_PROMETHEUS_IPV4_PMTU(iface, dev_id, sfx);		\
1543 	NET_STATS_PROMETHEUS_MLD(iface, dev_id, sfx);			\
1544 	NET_STATS_PROMETHEUS_IGMP(iface, dev_id, sfx);			\
1545 	NET_STATS_PROMETHEUS_DNS(iface, dev_id, sfx);			\
1546 	NET_STATS_PROMETHEUS_TX_TIME(iface, dev_id, sfx);		\
1547 	NET_STATS_PROMETHEUS_RX_TIME(iface, dev_id, sfx)
1548 
1549 /**
1550  * @}
1551  */
1552 
1553 #ifdef __cplusplus
1554 }
1555 #endif
1556 
1557 #endif /* ZEPHYR_INCLUDE_NET_NET_STATS_H_ */
1558