aboutsummaryrefslogtreecommitdiff
path: root/src/include/ipxe/ipstat.h
blob: b34ed5fcf64d9dd443dab418674550c57f8e236b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#ifndef _IPXE_IPSTATS_H
#define _IPXE_IPSTATS_H

/** @file
 *
 * IP statistics
 *
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );

#include <ipxe/tables.h>

struct io_buffer;

/** IP system statistics
 *
 * Definitions are taken from the RFC4293 section 5
 * "ipSystemStatsEntry" table.
 *
 * To minimise code size, we use "unsigned long" as the counter
 * variable type regardless of whether this type is 32-bit or 64-bit.
 * On a 32-bit build (e.g. the standard BIOS build), this means that
 * we omit the "high capacity" 64-bit counters (prefixed with "HC").
 * This reduces the code size required to maintain the counter values,
 * and avoids the need to support the "%lld" format in vsprintf.c
 * (which would require dragging in the 64-bit division library on a
 * standard 32-bit build).  Since total available memory in a 32-bit
 * environment is limited to 4GB, it is unlikely that we will overflow
 * even the 32-bit octet counters under normal operation.
 *
 * Counters relating to packet forwarding are omitted, since iPXE
 * includes no functionality for acting as a router.
 *
 * Counters related to output fragmentation are omitted, since iPXE
 * has no support for fragmenting transmitted packets.
 *
 * The ipSystemStatsInDiscards and ipSystemStatsOutDiscards counters
 * are omitted, since they will always be zero.
 *
 * Separate octet counters for multicast packets are omitted to save
 * code size.
 */
struct ip_statistics {
	/** ipSystemStatsInReceives
	 *
	 * The total number of input IP datagrams received, including
	 * those received in error.
	 */
	unsigned long in_receives;
	/** ipSystemStatsInOctets
	 *
	 * The total number of octets received in input IP datagrams,
	 * including those received in error.  Octets from datagrams
	 * counted in ipSystemStatsInReceives MUST be counted here.
	 */
	unsigned long in_octets;
	/** ipSystemStatsInHdrErrors
	 *
	 * The number of input IP datagrams discarded due to errors in
	 * their IP headers, including version number mismatch, other
	 * format errors, hop count exceeded, errors discovered in
	 * processing their IP options, etc.
	 */
	unsigned long in_hdr_errors;
	/** ipSystemStatsInAddrErrors
	 *
	 * The number of input IP datagrams discarded because the IP
	 * address in their IP header's destination field was not a
	 * valid address to be received at this entity.  This count
	 * includes invalid addresses (e.g., ::0).  For entities that
	 * are not IP routers and therefore do not forward datagrams,
	 * this counter includes datagrams discarded because the
	 * destination address was not a local address.
	 */
	unsigned long in_addr_errors;
	/** ipSystemStatsInUnknownProtos
	 *
	 * The number of locally-addressed IP datagrams received
	 * successfully but discarded because of an unknown or
	 * unsupported protocol.
	 */
	unsigned long in_unknown_protos;
	/** ipSystemStatsInTruncatedPkts
	 *
	 * The number of input IP datagrams discarded because the
	 * datagram frame didn't carry enough data.
	 */
	unsigned long in_truncated_pkts;
	/** ipSystemStatsReasmReqds
	 *
	 * The number of IP fragments received that needed to be
	 * reassembled at this interface.
	 */
	unsigned long reasm_reqds;
	/** ipSystemStatsReasmOks
	 *
	 * The number of IP datagrams successfully reassembled.
	 */
	unsigned long reasm_oks;
	/** ipSystemStatsReasmFails
	 *
	 * The number of failures detected by the IP re-assembly
	 * algorithm (for whatever reason: timed out, errors, etc.).
	 * Note that this is not necessarily a count of discarded IP
	 * fragments since some algorithms (notably the algorithm in
	 * RFC 815) can lose track of the number of fragments by
	 * combining them as they are received.
	 */
	unsigned long reasm_fails;
	/** ipSystemStatsInDelivers
	 *
	 * The total number of datagrams successfully delivered to IP
	 * user-protocols (including ICMP).
	 */
	unsigned long in_delivers;
	/** ipSystemStatsOutRequests
	 *
	 * The total number of IP datagrams that local IP user-
	 * protocols (including ICMP) supplied to IP in requests for
	 * transmission.
	 */
	unsigned long out_requests;
	/** ipSystemStatsOutNoRoutes
	 *
	 * The number of locally generated IP datagrams discarded
	 * because no route could be found to transmit them to their
	 * destination.
	 */
	unsigned long out_no_routes;
	/** ipSystemStatsOutTransmits
	 *
	 * The total number of IP datagrams that this entity supplied
	 * to the lower layers for transmission.  This includes
	 * datagrams generated locally and those forwarded by this
	 * entity.
	 */
	unsigned long out_transmits;
	/** ipSystemStatsOutOctets
	 *
	 * The total number of octets in IP datagrams delivered to the
	 * lower layers for transmission.  Octets from datagrams
	 * counted in ipSystemStatsOutTransmits MUST be counted here.
	 */
	unsigned long out_octets;
	/** ipSystemStatsInMcastPkts
	 *
	 * The number of IP multicast datagrams received.
	 */
	unsigned long in_mcast_pkts;
	/** ipSystemStatsOutMcastPkts
	 *
	 * The number of IP multicast datagrams transmitted.
	 */
	unsigned long out_mcast_pkts;
	/** ipSystemStatsInBcastPkts
	 *
	 * The number of IP broadcast datagrams received.
	 */
	unsigned long in_bcast_pkts;
	/** ipSystemStatsOutBcastPkts
	 *
	 * The number of IP broadcast datagrams transmitted.
	 */
	unsigned long out_bcast_pkts;
};

/** An IP system statistics family */
struct ip_statistics_family {
	/** IP version */
	unsigned int version;
	/** Statistics */
	struct ip_statistics *stats;
};

/** IP system statistics family table */
#define IP_STATISTICS_FAMILIES \
	__table ( struct ip_statistics_family, "ip_statistics_families" )

/** Declare an IP system statistics family */
#define __ip_statistics_family( order ) \
	__table_entry ( IP_STATISTICS_FAMILIES, order )

#define IP_STATISTICS_IPV4 01
#define IP_STATISTICS_IPV6 02

#endif /* _IPXE_IPSTATS_H */