1use net_types::ip::IpMarked;
8use netstack3_base::{Counter, Inspectable, Inspector, InspectorExt as _};
9
10pub type TcpCounters<I> = IpMarked<I, TcpCountersInner>;
17
18#[derive(Default)]
20pub struct TcpCountersInner {
23 pub invalid_ip_addrs_received: Counter,
26 pub invalid_segments_received: Counter,
29 pub valid_segments_received: Counter,
31 pub received_segments_dispatched: Counter,
34 pub received_segments_no_dispatch: Counter,
37 pub listener_queue_overflow: Counter,
40 pub segment_send_errors: Counter,
42 pub segments_sent: Counter,
44 pub passive_open_no_route_errors: Counter,
47 pub passive_connection_openings: Counter,
49 pub active_open_no_route_errors: Counter,
52 pub active_connection_openings: Counter,
54 pub failed_connection_attempts: Counter,
57 pub failed_port_reservations: Counter,
59 pub checksum_errors: Counter,
61 pub resets_received: Counter,
63 pub resets_sent: Counter,
65 pub syns_received: Counter,
67 pub syns_sent: Counter,
69 pub fins_received: Counter,
71 pub fins_sent: Counter,
73 pub timeouts: Counter,
75 pub retransmits: Counter,
77 pub slow_start_retransmits: Counter,
79 pub fast_retransmits: Counter,
81 pub fast_recovery: Counter,
83 pub established_closed: Counter,
85 pub established_resets: Counter,
88 pub established_timedout: Counter,
91}
92
93impl Inspectable for TcpCountersInner {
94 fn record<I: Inspector>(&self, inspector: &mut I) {
95 let TcpCountersInner {
96 invalid_ip_addrs_received,
97 invalid_segments_received,
98 valid_segments_received,
99 received_segments_dispatched,
100 received_segments_no_dispatch,
101 listener_queue_overflow,
102 segment_send_errors,
103 segments_sent,
104 passive_open_no_route_errors,
105 passive_connection_openings,
106 active_open_no_route_errors,
107 active_connection_openings,
108 failed_connection_attempts,
109 failed_port_reservations,
110 checksum_errors,
111 resets_received,
112 resets_sent,
113 syns_received,
114 syns_sent,
115 fins_received,
116 fins_sent,
117 timeouts,
118 retransmits,
119 slow_start_retransmits,
120 fast_retransmits,
121 fast_recovery,
122 established_closed,
123 established_resets,
124 established_timedout,
125 } = self;
126 inspector.record_child("Rx", |inspector| {
127 inspector.record_counter("ValidSegmentsReceived", valid_segments_received);
128 inspector.record_counter("ReceivedSegmentsDispatched", received_segments_dispatched);
129 inspector.record_counter("ResetsReceived", resets_received);
130 inspector.record_counter("SynsReceived", syns_received);
131 inspector.record_counter("FinsReceived", fins_received);
132 inspector.record_child("Errors", |inspector| {
133 inspector.record_counter("InvalidIpAddrsReceived", invalid_ip_addrs_received);
134 inspector.record_counter("InvalidSegmentsReceived", invalid_segments_received);
135 inspector
136 .record_counter("ReceivedSegmentsNoDispatch", received_segments_no_dispatch);
137 inspector.record_counter("ListenerQueueOverflow", listener_queue_overflow);
138 inspector.record_counter("PassiveOpenNoRouteErrors", passive_open_no_route_errors);
139 inspector.record_counter("ChecksumErrors", checksum_errors);
140 })
141 });
142 inspector.record_child("Tx", |inspector| {
143 inspector.record_counter("SegmentsSent", segments_sent);
144 inspector.record_counter("ResetsSent", resets_sent);
145 inspector.record_counter("SynsSent", syns_sent);
146 inspector.record_counter("FinsSent", fins_sent);
147 inspector.record_counter("Timeouts", timeouts);
148 inspector.record_counter("Retransmits", retransmits);
149 inspector.record_counter("SlowStartRetransmits", slow_start_retransmits);
150 inspector.record_counter("FastRetransmits", fast_retransmits);
151 inspector.record_child("Errors", |inspector| {
152 inspector.record_counter("SegmentSendErrors", segment_send_errors);
153 inspector.record_counter("ActiveOpenNoRouteErrors", active_open_no_route_errors);
154 });
155 });
156 inspector.record_counter("PassiveConnectionOpenings", passive_connection_openings);
157 inspector.record_counter("ActiveConnectionOpenings", active_connection_openings);
158 inspector.record_counter("FastRecovery", fast_recovery);
159 inspector.record_counter("EstablishedClosed", established_closed);
160 inspector.record_counter("EstablishedResets", established_resets);
161 inspector.record_counter("EstablishedTimedout", established_timedout);
162 inspector.record_child("Errors", |inspector| {
163 inspector.record_counter("FailedConnectionOpenings", failed_connection_attempts);
164 inspector.record_counter("FailedPortReservations", failed_port_reservations);
165 })
166 }
167}