ant_quic/tracing/
macros.rs

1//! Zero-cost macros for tracing
2//!
3//! These macros compile to nothing when the trace feature is disabled.
4
5/// Primary trace event macro - compiles to nothing when disabled
6#[macro_export]
7macro_rules! trace_event {
8    ($log:expr_2021, $event:expr_2021) => {
9        #[cfg(feature = "trace")]
10        $log.log($event)
11    };
12}
13
14/// Trace a packet sent event
15#[macro_export]
16macro_rules! trace_packet_sent {
17    ($log:expr_2021, $trace_id:expr_2021, $size:expr_2021, $num:expr_2021) => {
18        $crate::trace_event!(
19            $log,
20            $crate::tracing::Event {
21                timestamp: $crate::tracing::timestamp_now(),
22                trace_id: $trace_id,
23                event_data: $crate::tracing::EventData::PacketSent {
24                    size: $size as u32,
25                    packet_num: $num,
26                    _padding: [0u8; 52],
27                },
28                ..Default::default()
29            }
30        )
31    };
32}
33
34/// Trace a packet received event
35#[macro_export]
36macro_rules! trace_packet_received {
37    ($log:expr_2021, $trace_id:expr_2021, $size:expr_2021, $num:expr_2021) => {
38        $crate::trace_event!(
39            $log,
40            $crate::tracing::Event {
41                timestamp: $crate::tracing::timestamp_now(),
42                trace_id: $trace_id,
43                event_data: $crate::tracing::EventData::PacketReceived {
44                    size: $size as u32,
45                    packet_num: $num,
46                    _padding: [0u8; 52],
47                },
48                ..Default::default()
49            }
50        )
51    };
52}
53
54/// Trace a stream opened event
55#[macro_export]
56macro_rules! trace_stream_opened {
57    ($log:expr_2021, $trace_id:expr_2021, $stream_id:expr_2021) => {
58        $crate::trace_event!(
59            $log,
60            $crate::tracing::Event {
61                timestamp: $crate::tracing::timestamp_now(),
62                trace_id: $trace_id,
63                event_data: $crate::tracing::EventData::StreamOpened {
64                    stream_id: $stream_id,
65                    _padding: [0u8; 56],
66                },
67                ..Default::default()
68            }
69        )
70    };
71}
72
73/// Trace a connection established event
74#[macro_export]
75macro_rules! trace_conn_established {
76    ($log:expr_2021, $trace_id:expr_2021, $rtt:expr_2021) => {
77        $crate::trace_event!(
78            $log,
79            $crate::tracing::Event {
80                timestamp: $crate::tracing::timestamp_now(),
81                trace_id: $trace_id,
82                event_data: $crate::tracing::EventData::ConnEstablished {
83                    rtt: $rtt as u32,
84                    _padding: [0u8; 60],
85                },
86                ..Default::default()
87            }
88        )
89    };
90}
91
92/// Conditional code block that only compiles with trace feature
93#[macro_export]
94macro_rules! if_trace {
95    ($($body:tt)*) => {
96        #[cfg(feature = "trace")]
97        {
98            $($body)*
99        }
100    };
101}
102
103/// Trace an observed address event
104#[macro_export]
105macro_rules! trace_observed_address_sent {
106    ($log:expr_2021, $trace_id:expr_2021, $addr:expr_2021, $path_id:expr_2021) => {
107        $crate::trace_event!($log, {
108            let (addr_bytes, addr_type) = $crate::tracing::socket_addr_to_bytes($addr);
109            $crate::tracing::Event {
110                timestamp: $crate::tracing::timestamp_now(),
111                trace_id: $trace_id,
112                event_data: $crate::tracing::EventData::ObservedAddressSent {
113                    addr_bytes,
114                    addr_type,
115                    path_id: $path_id as u32,
116                    _padding: [0u8; 41],
117                },
118                ..Default::default()
119            }
120        })
121    };
122}
123
124/// Trace an observed address received
125#[macro_export]
126macro_rules! trace_observed_address_received {
127    ($log:expr_2021, $trace_id:expr_2021, $addr:expr_2021, $path_id:expr_2021) => {
128        $crate::trace_event!($log, {
129            let (addr_bytes, addr_type) = $crate::tracing::socket_addr_to_bytes($addr);
130            $crate::tracing::Event {
131                timestamp: $crate::tracing::timestamp_now(),
132                trace_id: $trace_id,
133                event_data: $crate::tracing::EventData::ObservedAddressReceived {
134                    addr_bytes,
135                    addr_type,
136                    from_peer: [0u8; 32], // TODO: Get actual peer ID
137                    _padding: [0u8; 13],
138                },
139                ..Default::default()
140            }
141        })
142    };
143}
144
145/// Trace a NAT traversal candidate discovered
146#[macro_export]
147macro_rules! trace_candidate_discovered {
148    ($log:expr_2021, $trace_id:expr_2021, $addr:expr_2021, $priority:expr_2021) => {
149        $crate::trace_event!($log, {
150            let (addr_bytes, addr_type) = $crate::tracing::socket_addr_to_bytes($addr);
151            $crate::tracing::Event {
152                timestamp: $crate::tracing::timestamp_now(),
153                trace_id: $trace_id,
154                event_data: $crate::tracing::EventData::CandidateDiscovered {
155                    addr_bytes,
156                    addr_type,
157                    priority: $priority as u32,
158                    _padding: [0u8; 41],
159                },
160                ..Default::default()
161            }
162        })
163    };
164}
165
166/// Trace hole punching started
167#[macro_export]
168macro_rules! trace_hole_punching_started {
169    ($log:expr_2021, $trace_id:expr_2021, $peer:expr_2021) => {
170        $crate::trace_event!(
171            $log,
172            $crate::tracing::Event {
173                timestamp: $crate::tracing::timestamp_now(),
174                trace_id: $trace_id,
175                event_data: $crate::tracing::EventData::HolePunchingStarted {
176                    peer: $peer,
177                    _padding: [0u8; 32],
178                },
179                ..Default::default()
180            }
181        )
182    };
183}
184
185#[cfg(test)]
186mod tests {
187    use crate::tracing::{EventLog, TraceId};
188
189    #[test]
190    fn test_trace_macros() {
191        let _log = EventLog::new();
192        let _trace_id = TraceId::new();
193
194        // These should compile whether trace is enabled or not
195        trace_packet_sent!(&_log, _trace_id, 1200, 42);
196        trace_packet_received!(&_log, _trace_id, 1200, 43);
197        trace_stream_opened!(&_log, _trace_id, 1);
198        trace_conn_established!(&_log, _trace_id, 25);
199
200        if_trace! {
201            // This code only exists when trace is enabled
202            #[cfg(feature = "trace")]
203            let _count = _log.event_count();
204        }
205    }
206}