/src/h2o/deps/quicly/include/quicly.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2017 Fastly, Kazuho Oku |
3 | | * |
4 | | * Permission is hereby granted, free of charge, to any person obtaining a copy |
5 | | * of this software and associated documentation files (the "Software"), to |
6 | | * deal in the Software without restriction, including without limitation the |
7 | | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
8 | | * sell copies of the Software, and to permit persons to whom the Software is |
9 | | * furnished to do so, subject to the following conditions: |
10 | | * |
11 | | * The above copyright notice and this permission notice shall be included in |
12 | | * all copies or substantial portions of the Software. |
13 | | * |
14 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
15 | | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
16 | | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
17 | | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
18 | | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
19 | | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
20 | | * IN THE SOFTWARE. |
21 | | */ |
22 | | #ifndef quicly_h |
23 | | #define quicly_h |
24 | | |
25 | | #ifdef __cplusplus |
26 | | extern "C" { |
27 | | #endif |
28 | | |
29 | | #include <netinet/in.h> |
30 | | #include <stdint.h> |
31 | | #include <stdio.h> |
32 | | #include <string.h> |
33 | | #include <sys/socket.h> |
34 | | #include <sys/types.h> |
35 | | #include "picotls.h" |
36 | | #include "quicly/constants.h" |
37 | | #include "quicly/frame.h" |
38 | | #include "quicly/local_cid.h" |
39 | | #include "quicly/linklist.h" |
40 | | #include "quicly/loss.h" |
41 | | #include "quicly/cc.h" |
42 | | #include "quicly/rate.h" |
43 | | #include "quicly/recvstate.h" |
44 | | #include "quicly/sendstate.h" |
45 | | #include "quicly/maxsender.h" |
46 | | #include "quicly/cid.h" |
47 | | #include "quicly/remote_cid.h" |
48 | | |
49 | | /* invariants! */ |
50 | 0 | #define QUICLY_LONG_HEADER_BIT 0x80 |
51 | 0 | #define QUICLY_QUIC_BIT 0x40 |
52 | 0 | #define QUICLY_KEY_PHASE_BIT 0x4 |
53 | 0 | #define QUICLY_LONG_HEADER_RESERVED_BITS 0xc |
54 | 0 | #define QUICLY_SHORT_HEADER_RESERVED_BITS 0x18 |
55 | | |
56 | 0 | #define QUICLY_PACKET_TYPE_INITIAL (QUICLY_LONG_HEADER_BIT | QUICLY_QUIC_BIT | 0) |
57 | 0 | #define QUICLY_PACKET_TYPE_0RTT (QUICLY_LONG_HEADER_BIT | QUICLY_QUIC_BIT | 0x10) |
58 | 0 | #define QUICLY_PACKET_TYPE_HANDSHAKE (QUICLY_LONG_HEADER_BIT | QUICLY_QUIC_BIT | 0x20) |
59 | 0 | #define QUICLY_PACKET_TYPE_RETRY (QUICLY_LONG_HEADER_BIT | QUICLY_QUIC_BIT | 0x30) |
60 | 0 | #define QUICLY_PACKET_TYPE_BITMASK 0xf0 |
61 | | |
62 | 0 | #define QUICLY_PACKET_IS_LONG_HEADER(first_byte) (((first_byte) & QUICLY_LONG_HEADER_BIT) != 0) |
63 | | |
64 | | /** |
65 | | * Version 1. |
66 | | */ |
67 | 0 | #define QUICLY_PROTOCOL_VERSION_1 0x1 |
68 | | /** |
69 | | * The current version being supported. At the moment, it is draft-29. |
70 | | */ |
71 | 0 | #define QUICLY_PROTOCOL_VERSION_DRAFT29 0xff00001d |
72 | | /** |
73 | | * Draft-27 is also supported. |
74 | | */ |
75 | 0 | #define QUICLY_PROTOCOL_VERSION_DRAFT27 0xff00001b |
76 | | |
77 | | #define QUICLY_PACKET_IS_INITIAL(first_byte) (((first_byte) & 0xf0) == 0xc0) |
78 | | |
79 | 0 | #define QUICLY_STATELESS_RESET_PACKET_MIN_LEN 39 |
80 | | |
81 | 0 | #define QUICLY_MAX_PN_SIZE 4 /* maximum defined by the RFC used for calculating header protection sampling offset */ |
82 | 0 | #define QUICLY_SEND_PN_SIZE 2 /* size of PN used for sending */ |
83 | | |
84 | 0 | #define QUICLY_AEAD_BASE_LABEL "tls13 quic " |
85 | | |
86 | | typedef union st_quicly_address_t { |
87 | | struct sockaddr sa; |
88 | | struct sockaddr_in sin; |
89 | | struct sockaddr_in6 sin6; |
90 | | } quicly_address_t; |
91 | | |
92 | | typedef struct st_quicly_context_t quicly_context_t; |
93 | | typedef struct st_quicly_stream_t quicly_stream_t; |
94 | | typedef struct st_quicly_send_context_t quicly_send_context_t; |
95 | | typedef struct st_quicly_address_token_plaintext_t quicly_address_token_plaintext_t; |
96 | | |
97 | | #define QUICLY_CALLBACK_TYPE0(ret, name) \ |
98 | | typedef struct st_quicly_##name##_t { \ |
99 | | ret (*cb)(struct st_quicly_##name##_t * self); \ |
100 | | } quicly_##name##_t |
101 | | |
102 | | #define QUICLY_CALLBACK_TYPE(ret, name, ...) \ |
103 | | typedef struct st_quicly_##name##_t { \ |
104 | | ret (*cb)(struct st_quicly_##name##_t * self, __VA_ARGS__); \ |
105 | | } quicly_##name##_t |
106 | | |
107 | | /** |
108 | | * stream scheduler |
109 | | */ |
110 | | typedef struct st_quicly_stream_scheduler_t { |
111 | | /** |
112 | | * returns if there's any data to send. |
113 | | * @param conn_is_flow_capped if the connection-level flow control window is currently saturated |
114 | | */ |
115 | | int (*can_send)(struct st_quicly_stream_scheduler_t *sched, quicly_conn_t *conn, int conn_is_saturated); |
116 | | /** |
117 | | * Called by quicly to emit stream data. The scheduler should repeatedly choose a stream and call `quicly_send_stream` until |
118 | | * `quicly_can_send_stream` returns false. |
119 | | */ |
120 | | quicly_error_t (*do_send)(struct st_quicly_stream_scheduler_t *sched, quicly_conn_t *conn, quicly_send_context_t *s); |
121 | | /** |
122 | | * |
123 | | */ |
124 | | void (*update_state)(struct st_quicly_stream_scheduler_t *sched, quicly_stream_t *stream); |
125 | | } quicly_stream_scheduler_t; |
126 | | |
127 | | /** |
128 | | * called when stream is being open. Application is expected to create it's corresponding state and tie it to stream->data. |
129 | | */ |
130 | | QUICLY_CALLBACK_TYPE(quicly_error_t, stream_open, quicly_stream_t *stream); |
131 | | /** |
132 | | * |
133 | | */ |
134 | | QUICLY_CALLBACK_TYPE(void, receive_datagram_frame, quicly_conn_t *conn, ptls_iovec_t payload); |
135 | | /** |
136 | | * Called when the connection is closed (i.e., when entering the closing or draining state). Otherwise the callback is not called; |
137 | | * e.g., when `quicly_free` is called directly while the connection is in the connected state. Call `quicly_get_close_reason` to |
138 | | * obtain the details of the closure. |
139 | | */ |
140 | | QUICLY_CALLBACK_TYPE(void, closed, quicly_conn_t *conn); |
141 | | /** |
142 | | * Returns current time in milliseconds. The returned value MUST monotonically increase (i.e., it is the responsibility of the |
143 | | * callback implementation to guarantee that the returned value never goes back to the past). |
144 | | */ |
145 | | QUICLY_CALLBACK_TYPE0(int64_t, now); |
146 | | /** |
147 | | * called when a NEW_TOKEN token is received on a connection |
148 | | */ |
149 | | QUICLY_CALLBACK_TYPE(quicly_error_t, save_resumption_token, quicly_conn_t *conn, ptls_iovec_t token); |
150 | | /** |
151 | | * |
152 | | */ |
153 | | QUICLY_CALLBACK_TYPE(quicly_error_t, generate_resumption_token, quicly_conn_t *conn, ptls_buffer_t *buf, |
154 | | quicly_address_token_plaintext_t *token); |
155 | | /** |
156 | | * called to initialize a congestion controller for a new connection. |
157 | | * should in turn call one of the quicly_cc_*_init functions from cc.h with customized parameters. |
158 | | */ |
159 | | QUICLY_CALLBACK_TYPE(void, init_cc, quicly_cc_t *cc, uint32_t initcwnd, int64_t now); |
160 | | /** |
161 | | * reference counting. |
162 | | * delta must be either 1 or -1. |
163 | | */ |
164 | | QUICLY_CALLBACK_TYPE(void, update_open_count, ssize_t delta); |
165 | | /** |
166 | | * Called when picotls return PTLS_ERROR_ASYNC_OPERATION. The application must call `ptls_resume_handshake` once the async operation |
167 | | * is complete. |
168 | | */ |
169 | | QUICLY_CALLBACK_TYPE(void, async_handshake, ptls_t *tls); |
170 | | |
171 | | /** |
172 | | * crypto offload API |
173 | | */ |
174 | | typedef struct st_quicly_crypto_engine_t { |
175 | | /** |
176 | | * Callback used for setting up the header protection keys / packet protection keys. The callback MUST initialize or replace |
177 | | * `header_protect_ctx` and `packet_protect_ctx` as specified by QUIC-TLS. This callback might be called more than once for |
178 | | * 1-RTT epoch, when the key is updated. In such case, there is no need to update the header protection context, and therefore |
179 | | * `header_protect_ctx` will be NULL. |
180 | | * |
181 | | * @param header_protect_ctx address of where the header protection context should be written. Might be NULL when called to |
182 | | * handle 1-RTT Key Update. |
183 | | * @param packet_protect_ctx address of where the packet protection context should be written. |
184 | | * @param secret the secret from which the protection keys is derived. The length of the secret is |
185 | | `hash->digest_size`. |
186 | | * @note At the moment, the callback is not invoked for Initial keys when running as server. |
187 | | */ |
188 | | int (*setup_cipher)(struct st_quicly_crypto_engine_t *engine, quicly_conn_t *conn, size_t epoch, int is_enc, |
189 | | ptls_cipher_context_t **header_protect_ctx, ptls_aead_context_t **packet_protect_ctx, |
190 | | ptls_aead_algorithm_t *aead, ptls_hash_algorithm_t *hash, const void *secret); |
191 | | /** |
192 | | * Callback used for encrypting the send packet. The engine must AEAD-encrypt the payload using `packet_protect_ctx` and apply |
193 | | * header protection using `header_protect_ctx`. Quicly does not read or write the content of the UDP datagram payload after |
194 | | * this function is called. Therefore, an engine might retain the information provided by this function, and protect the packet |
195 | | * and the header at a later moment (e.g., hardware crypto offload). |
196 | | */ |
197 | | void (*encrypt_packet)(struct st_quicly_crypto_engine_t *engine, quicly_conn_t *conn, ptls_cipher_context_t *header_protect_ctx, |
198 | | ptls_aead_context_t *packet_protect_ctx, ptls_iovec_t datagram, size_t first_byte_at, |
199 | | size_t payload_from, uint64_t packet_number, int coalesced); |
200 | | } quicly_crypto_engine_t; |
201 | | |
202 | | /** |
203 | | * data structure used for self-tracing |
204 | | */ |
205 | | typedef struct st_quicly_tracer_t { |
206 | | /** |
207 | | * NULL when not used |
208 | | */ |
209 | | void (*cb)(void *ctx, const char *fmt, ...) __attribute__((format(printf, 2, 3))); |
210 | | /** |
211 | | * |
212 | | */ |
213 | | void *ctx; |
214 | | } quicly_tracer_t; |
215 | | |
216 | | typedef struct st_quicly_max_stream_data_t { |
217 | | uint64_t bidi_local, bidi_remote, uni; |
218 | | } quicly_max_stream_data_t; |
219 | | |
220 | | /** |
221 | | * Transport Parameters; the struct contains "configuration parameters", ODCID is managed separately |
222 | | */ |
223 | | typedef struct st_quicly_transport_parameters_t { |
224 | | /** |
225 | | * in octets |
226 | | */ |
227 | | quicly_max_stream_data_t max_stream_data; |
228 | | /** |
229 | | * in octets |
230 | | */ |
231 | | uint64_t max_data; |
232 | | /** |
233 | | * in milliseconds |
234 | | */ |
235 | | uint64_t max_idle_timeout; |
236 | | /** |
237 | | * |
238 | | */ |
239 | | uint64_t max_streams_bidi; |
240 | | /** |
241 | | * |
242 | | */ |
243 | | uint64_t max_streams_uni; |
244 | | /** |
245 | | * |
246 | | */ |
247 | | uint64_t max_udp_payload_size; |
248 | | /** |
249 | | * quicly ignores the value set for quicly_context_t::transport_parameters |
250 | | */ |
251 | | uint8_t ack_delay_exponent; |
252 | | /** |
253 | | * in milliseconds; quicly ignores the value set for quicly_context_t::transport_parameters |
254 | | */ |
255 | | uint16_t max_ack_delay; |
256 | | /** |
257 | | * Delayed-ack extension. UINT64_MAX indicates that the extension is disabled or that the peer does not support it. Any local |
258 | | * value other than UINT64_MAX indicates that the use of the extension should be negotiated. |
259 | | */ |
260 | | uint64_t min_ack_delay_usec; |
261 | | /** |
262 | | * |
263 | | */ |
264 | | uint8_t disable_active_migration : 1; |
265 | | /** |
266 | | * |
267 | | */ |
268 | | uint64_t active_connection_id_limit; |
269 | | /** |
270 | | * |
271 | | */ |
272 | | uint16_t max_datagram_frame_size; |
273 | | } quicly_transport_parameters_t; |
274 | | |
275 | | typedef struct st_quicly_salt_t { |
276 | | uint8_t initial[20]; |
277 | | struct { |
278 | | uint8_t key[PTLS_AES128_KEY_SIZE]; |
279 | | uint8_t iv[PTLS_AESGCM_IV_SIZE]; |
280 | | } retry; |
281 | | } quicly_salt_t; |
282 | | |
283 | | struct st_quicly_context_t { |
284 | | /** |
285 | | * tls context to use |
286 | | */ |
287 | | ptls_context_t *tls; |
288 | | /** |
289 | | * Maximum size of packets that we are willing to send when path-specific information is unavailable. As a |
290 | | * path-specific optimization, quicly acting as a server sets this value to `min(remote.tp.max_udp_payload_size, |
291 | | * max(local.tp.max_udp_payload_size, max_size_of_incoming_datagrams)` when it receives the Transport Parameters |
292 | | * from the client. |
293 | | */ |
294 | | uint16_t initial_egress_max_udp_payload_size; |
295 | | /** |
296 | | * loss detection parameters |
297 | | */ |
298 | | quicly_loss_conf_t loss; |
299 | | /** |
300 | | * transport parameters |
301 | | */ |
302 | | quicly_transport_parameters_t transport_params; |
303 | | /** |
304 | | * number of packets that can be sent without a key update |
305 | | */ |
306 | | uint64_t max_packets_per_key; |
307 | | /** |
308 | | * maximum number of bytes that can be transmitted on a CRYPTO stream (per each epoch) |
309 | | */ |
310 | | uint32_t max_crypto_bytes; |
311 | | /** |
312 | | * initial CWND in terms of packet numbers |
313 | | */ |
314 | | uint32_t initcwnd_packets; |
315 | | /** |
316 | | * (client-only) Initial QUIC protocol version used by the client. Setting this to a greased version will enforce version |
317 | | * negotiation. |
318 | | */ |
319 | | uint32_t initial_version; |
320 | | /** |
321 | | * (server-only) amplification limit before the peer address is validated |
322 | | */ |
323 | | uint16_t pre_validation_amplification_limit; |
324 | | /** |
325 | | * How frequent the endpoint should induce ACKs from the peer, relative to RTT (or CWND) multiplied by 1024. As an example, 128 |
326 | | * will request the peer to send one ACK every 1/8 RTT (or CWND). 0 disables the use of the delayed-ack extension. |
327 | | */ |
328 | | uint16_t ack_frequency; |
329 | | /** |
330 | | * If the handshake does not complete within this value * RTT, close connection. |
331 | | * When RTT is not observed, timeout is calculated relative to initial RTT (333ms by default). |
332 | | */ |
333 | | uint32_t handshake_timeout_rtt_multiplier; |
334 | | /** |
335 | | * If the number of Initial/Handshake packets sent during the handshake phase exceeds this limit, treat it as an error and close |
336 | | * the connection. |
337 | | */ |
338 | | uint64_t max_initial_handshake_packets; |
339 | | /** |
340 | | * maximum number of probe packets (i.e., packets carrying PATH_CHALLENGE frames) to be sent before calling a path unreachable |
341 | | */ |
342 | | uint64_t max_probe_packets; |
343 | | /** |
344 | | * Once path validation fails for the specified number of paths, packets arriving on new tuples will be dropped. Setting this |
345 | | * value to zero effectively disables the endpoint responding to path migration attempts. |
346 | | */ |
347 | | uint64_t max_path_validation_failures; |
348 | | /** |
349 | | * Jumpstart CWND to be used when there is no previous information. If set to zero, slow start is used. Note jumpstart is |
350 | | * possible only when the use_pacing flag is set. |
351 | | */ |
352 | | uint32_t default_jumpstart_cwnd_packets; |
353 | | /** |
354 | | * Maximum jumpstart CWND to be used for connections with previous delivery rate information (i.e., resuming connections). If |
355 | | * set to zero, slow start is used. |
356 | | */ |
357 | | uint32_t max_jumpstart_cwnd_packets; |
358 | | /** |
359 | | * Probabilities for enabling jumpstart when they are configured, multiplied by 255. 0 means never, 255 (default) means always. |
360 | | */ |
361 | | struct { |
362 | | struct { |
363 | | uint8_t non_resume; |
364 | | uint8_t resume; |
365 | | } jumpstart; |
366 | | /** |
367 | | * if rapid cstart should be used |
368 | | */ |
369 | | uint8_t rapid_start; |
370 | | /** |
371 | | * whether to use ECN on the send side; ECN is always on on the receive side |
372 | | */ |
373 | | uint8_t ecn; |
374 | | /** |
375 | | * if pacing should be used |
376 | | */ |
377 | | uint8_t pacing; |
378 | | /** |
379 | | * if CC should take app-limited into consideration |
380 | | */ |
381 | | uint8_t respect_app_limited; |
382 | | } enable_ratio; |
383 | | /** |
384 | | * expand client hello so that it does not fit into one datagram |
385 | | */ |
386 | | unsigned expand_client_hello : 1; |
387 | | /** |
388 | | * |
389 | | */ |
390 | | quicly_cid_encryptor_t *cid_encryptor; |
391 | | /** |
392 | | * callback called when a new stream is opened by remote peer |
393 | | */ |
394 | | quicly_stream_open_t *stream_open; |
395 | | /** |
396 | | * callbacks for scheduling stream data |
397 | | */ |
398 | | quicly_stream_scheduler_t *stream_scheduler; |
399 | | /** |
400 | | * callback for receiving datagram frame |
401 | | */ |
402 | | quicly_receive_datagram_frame_t *receive_datagram_frame; |
403 | | /** |
404 | | * callback called when a connection enters closing or draining |
405 | | */ |
406 | | quicly_closed_t *closed; |
407 | | /** |
408 | | * returns current time in milliseconds |
409 | | */ |
410 | | quicly_now_t *now; |
411 | | /** |
412 | | * called when a NEW_TOKEN token is being received |
413 | | */ |
414 | | quicly_save_resumption_token_t *save_resumption_token; |
415 | | /** |
416 | | * |
417 | | */ |
418 | | quicly_generate_resumption_token_t *generate_resumption_token; |
419 | | /** |
420 | | * crypto engine (offload API) |
421 | | */ |
422 | | quicly_crypto_engine_t *crypto_engine; |
423 | | /** |
424 | | * initializes a congestion controller for given connection |
425 | | */ |
426 | | quicly_init_cc_t *init_cc; |
427 | | /** |
428 | | * optional refcount callback |
429 | | */ |
430 | | quicly_update_open_count_t *update_open_count; |
431 | | /** |
432 | | * |
433 | | */ |
434 | | quicly_async_handshake_t *async_handshake; |
435 | | }; |
436 | | |
437 | | /** |
438 | | * connection state |
439 | | */ |
440 | | typedef enum { |
441 | | /** |
442 | | * before observing the first message from remote peer |
443 | | */ |
444 | | QUICLY_STATE_FIRSTFLIGHT, |
445 | | /** |
446 | | * internal state used to indicate that the connection has not been provided to the application (and therefore might not have |
447 | | * application data being associated) |
448 | | */ |
449 | | QUICLY_STATE_ACCEPTING, |
450 | | /** |
451 | | * while connected |
452 | | */ |
453 | | QUICLY_STATE_CONNECTED, |
454 | | /** |
455 | | * sending close, but haven't seen the remote peer sending close |
456 | | */ |
457 | | QUICLY_STATE_CLOSING, |
458 | | /** |
459 | | * we do not send CLOSE (at the moment), enter draining mode when receiving CLOSE |
460 | | */ |
461 | | QUICLY_STATE_DRAINING |
462 | | } quicly_state_t; |
463 | | |
464 | | struct st_quicly_conn_streamgroup_state_t { |
465 | | uint32_t num_streams; |
466 | | quicly_stream_id_t next_stream_id; |
467 | | }; |
468 | | |
469 | | /** |
470 | | * These fields that exist within QUICLY_STATS_PREBUILT_FIELDS as the first elements are the stat counters that can be aggregated to |
471 | | * calclucate total amongst multiple connections. |
472 | | */ |
473 | | #define QUICLY_STATS_PREBUILT_COUNTERS \ |
474 | | struct { \ |
475 | | /** \ |
476 | | * Total number of packets received. \ |
477 | | */ \ |
478 | | uint64_t received; \ |
479 | | /** \ |
480 | | * Total number of packets that failed decryption. \ |
481 | | */ \ |
482 | | uint64_t decryption_failed; \ |
483 | | /** \ |
484 | | * Total number of packets sent. \ |
485 | | */ \ |
486 | | uint64_t sent; \ |
487 | | /** \ |
488 | | * Total number of packets marked lost. \ |
489 | | */ \ |
490 | | uint64_t lost; \ |
491 | | /** \ |
492 | | * Total number of packets marked lost via time-threshold loss detection. \ |
493 | | */ \ |
494 | | uint64_t lost_time_threshold; \ |
495 | | /** \ |
496 | | * Total number of packets for which acknowledgements have been received. \ |
497 | | */ \ |
498 | | uint64_t ack_received; \ |
499 | | /** \ |
500 | | * Total number of packets for which acknowledgements were received after being marked lost. \ |
501 | | */ \ |
502 | | uint64_t late_acked; \ |
503 | | /** \ |
504 | | * Total number of Initial packets received. \ |
505 | | */ \ |
506 | | uint64_t initial_received; \ |
507 | | /** \ |
508 | | * Total number of 0-RTT packets received. \ |
509 | | */ \ |
510 | | uint64_t zero_rtt_received; \ |
511 | | /** \ |
512 | | * Total number of Handshake packets received. \ |
513 | | */ \ |
514 | | uint64_t handshake_received; \ |
515 | | /** \ |
516 | | * Total number of Initial packets sent. \ |
517 | | */ \ |
518 | | uint64_t initial_sent; \ |
519 | | /** \ |
520 | | * Total number of 0-RTT packets sent. \ |
521 | | */ \ |
522 | | uint64_t zero_rtt_sent; \ |
523 | | /** \ |
524 | | * Total number of Handshake packets sent. \ |
525 | | */ \ |
526 | | uint64_t handshake_sent; \ |
527 | | /** \ |
528 | | * Total number of packets received out of order. \ |
529 | | */ \ |
530 | | uint64_t received_out_of_order; \ |
531 | | /** \ |
532 | | * connection-wide counters for ECT(0), ECT(1), CE \ |
533 | | */ \ |
534 | | uint64_t received_ecn_counts[3]; \ |
535 | | /** \ |
536 | | * connection-wide ack-received counters for ECT(0), ECT(1), CE \ |
537 | | */ \ |
538 | | uint64_t acked_ecn_counts[3]; \ |
539 | | /** \ |
540 | | * Total number of packets sent on promoted paths. \ |
541 | | */ \ |
542 | | uint64_t sent_promoted_paths; \ |
543 | | /** \ |
544 | | * Total number of acked packets that were sent on promoted. \ |
545 | | */ \ |
546 | | uint64_t ack_received_promoted_paths; \ |
547 | | /** \ |
548 | | * Maximum number of packets that were buffered to delay their processing due to being undecryptable. \ |
549 | | */ \ |
550 | | uint64_t max_delayed; \ |
551 | | /** \ |
552 | | * Number of packets that were delayed processing and successfully used. \ |
553 | | */ \ |
554 | | uint64_t delayed_used; \ |
555 | | } num_packets; \ |
556 | | struct { \ |
557 | | /** \ |
558 | | * Total bytes received, at UDP datagram-level. Used for determining the amplification limit. \ |
559 | | */ \ |
560 | | uint64_t received; \ |
561 | | /** \ |
562 | | * Total bytes sent, at UDP datagram-level. \ |
563 | | */ \ |
564 | | uint64_t sent; \ |
565 | | /** \ |
566 | | * Total bytes sent but lost, at UDP datagram-level. \ |
567 | | */ \ |
568 | | uint64_t lost; \ |
569 | | /** \ |
570 | | * Total number of bytes for which acknowledgements have been received. \ |
571 | | */ \ |
572 | | uint64_t ack_received; \ |
573 | | /** \ |
574 | | * Total amount of stream-level payload being sent \ |
575 | | */ \ |
576 | | uint64_t stream_data_sent; \ |
577 | | /** \ |
578 | | * Total amount of stream-level payload being resent \ |
579 | | */ \ |
580 | | uint64_t stream_data_resent; \ |
581 | | } num_bytes; \ |
582 | | /** \ |
583 | | * Total number of each frame being sent / received. \ |
584 | | */ \ |
585 | | struct { \ |
586 | | uint64_t padding, ping, ack, reset_stream, stop_sending, crypto, new_token, stream, max_data, max_stream_data, \ |
587 | | max_streams_bidi, max_streams_uni, data_blocked, stream_data_blocked, streams_blocked, new_connection_id, \ |
588 | | retire_connection_id, path_challenge, path_response, transport_close, application_close, handshake_done, datagram, \ |
589 | | ack_frequency, immediate_ack; \ |
590 | | } num_frames_received, num_frames_sent; \ |
591 | | struct { \ |
592 | | /** \ |
593 | | * number of alternate paths created \ |
594 | | */ \ |
595 | | uint64_t created; \ |
596 | | /** \ |
597 | | * number alternate paths validated \ |
598 | | */ \ |
599 | | uint64_t validated; \ |
600 | | /** \ |
601 | | * number of alternate paths that were created but failed to validate \ |
602 | | */ \ |
603 | | uint64_t validation_failed; \ |
604 | | /** \ |
605 | | * number of paths on which migration has been elicited (i.e., received non-probing packets) \ |
606 | | */ \ |
607 | | uint64_t migration_elicited; \ |
608 | | /** \ |
609 | | * number of migrations \ |
610 | | */ \ |
611 | | uint64_t promoted; \ |
612 | | /** \ |
613 | | * number of alternate paths that were closed due to Connection ID being unavailable \ |
614 | | */ \ |
615 | | uint64_t closed_no_dcid; \ |
616 | | /** \ |
617 | | * number of paths that were ECN-capable \ |
618 | | */ \ |
619 | | uint64_t ecn_validated; \ |
620 | | /** \ |
621 | | * number of paths that were deemed as ECN black holes \ |
622 | | */ \ |
623 | | uint64_t ecn_failed; \ |
624 | | } num_paths; \ |
625 | | /** \ |
626 | | * Total number of PTOs observed during the connection. \ |
627 | | */ \ |
628 | | uint64_t num_ptos; \ |
629 | | /** \ |
630 | | * number of timeouts occurred during handshake due to no progress being made (see `handshake_timeout_rtt_multiplier`) \ |
631 | | */ \ |
632 | | uint64_t num_handshake_timeouts; \ |
633 | | /** \ |
634 | | * Total number of events where `initial_handshake_sent` exceeds limit. \ |
635 | | */ \ |
636 | | uint64_t num_initial_handshake_exceeded; \ |
637 | | /** \ |
638 | | * Number of connections for which jumpstart is or could have been used. \ |
639 | | */ \ |
640 | | uint64_t num_jumpstart_applicable; \ |
641 | | /** \ |
642 | | * Number of connections that used rapid start. \ |
643 | | */ \ |
644 | | uint64_t num_rapid_start; \ |
645 | | /** \ |
646 | | * Total number of connections that were paced. \ |
647 | | */ \ |
648 | | uint64_t num_paced; \ |
649 | | /** \ |
650 | | * Total number of connections where app-limited state was respected by CC. \ |
651 | | */ \ |
652 | | uint64_t num_respected_app_limited |
653 | | |
654 | | /** |
655 | | * Stats that do not need to be gathered upon the invocation of `quicly_get_stats`. This macro is used to define the same fields in |
656 | | * the same order for quicly_stats_t and `struct st_quicly_conn_public_t::stats`. |
657 | | */ |
658 | | #define QUICLY_STATS_PREBUILT_FIELDS \ |
659 | | QUICLY_STATS_PREBUILT_COUNTERS; \ |
660 | | /** \ |
661 | | * Time took until handshake is confirmed. UINT64_MAX if handshake is not confirmed yet. \ |
662 | | */ \ |
663 | | uint64_t handshake_confirmed_msec; \ |
664 | | /** \ |
665 | | * jumpstart parameters and the CWND being adopted (see also quicly_cc_t::cwnd_exiting_jumpstart) \ |
666 | | */ \ |
667 | | struct { \ |
668 | | uint64_t prev_rate; \ |
669 | | uint32_t prev_rtt; \ |
670 | | uint32_t new_rtt; \ |
671 | | uint32_t cwnd; \ |
672 | | } jumpstart; \ |
673 | | /** \ |
674 | | * some contents of the last token sent \ |
675 | | */ \ |
676 | | struct { \ |
677 | | /** \ |
678 | | * when sent, relative to the creation time of the connection \ |
679 | | */ \ |
680 | | int64_t at; \ |
681 | | /** \ |
682 | | * delivery rate \ |
683 | | */ \ |
684 | | uint64_t rate; \ |
685 | | /** \ |
686 | | * rtt \ |
687 | | */ \ |
688 | | uint32_t rtt; \ |
689 | | } token_sent |
690 | | |
691 | | typedef struct st_quicly_stats_t { |
692 | | /** |
693 | | * The pre-built fields. This MUST be the first member of `quicly_stats_t` so that we can use `memcpy`. |
694 | | */ |
695 | | QUICLY_STATS_PREBUILT_FIELDS; |
696 | | /** |
697 | | * RTT stats. |
698 | | */ |
699 | | quicly_rtt_t rtt; |
700 | | /** |
701 | | * Loss thresholds. |
702 | | */ |
703 | | quicly_loss_thresholds_t loss_thresholds; |
704 | | /** |
705 | | * Congestion control stats (experimental; TODO cherry-pick what can be exposed as part of a stable API). |
706 | | */ |
707 | | quicly_cc_t cc; |
708 | | /** |
709 | | * Estimated delivery rate, in bytes/second. |
710 | | */ |
711 | | quicly_rate_t delivery_rate; |
712 | | /** |
713 | | * largest number of packets contained in the sentmap |
714 | | */ |
715 | | size_t num_sentmap_packets_largest; |
716 | | } quicly_stats_t; |
717 | | |
718 | | /* clang-format off */ |
719 | | |
720 | | #define QUICLY_STATS_FOREACH_NUM_PACKETS(apply) \ |
721 | 6.64k | apply(num_packets.received, "num-packets.received") \ |
722 | 6.64k | apply(num_packets.decryption_failed, "num-packets.decryption-failed") \ |
723 | 6.64k | apply(num_packets.sent, "num-packets.sent") \ |
724 | 6.64k | apply(num_packets.lost, "num-packets.lost") \ |
725 | 6.64k | apply(num_packets.lost_time_threshold, "num-packets.lost-time-threshold") \ |
726 | 6.64k | apply(num_packets.ack_received, "num-packets.ack-received") \ |
727 | 6.64k | apply(num_packets.late_acked, "num-packets.late-acked") \ |
728 | 6.64k | apply(num_packets.initial_received, "num-packets.initial-received") \ |
729 | 6.64k | apply(num_packets.zero_rtt_received, "num-packets.zero-rtt-received") \ |
730 | 6.64k | apply(num_packets.handshake_received, "num-packets.handshake-received") \ |
731 | 6.64k | apply(num_packets.initial_sent, "num-packets.initial-sent") \ |
732 | 6.64k | apply(num_packets.zero_rtt_sent, "num-packets.zero-rtt-sent") \ |
733 | 6.64k | apply(num_packets.handshake_sent, "num-packets.handshake-sent") \ |
734 | 6.64k | apply(num_packets.received_out_of_order, "num-packets.received-out-of-order") \ |
735 | 6.64k | apply(num_packets.received_ecn_counts[0], "num-packets.received-ecn-ect0") \ |
736 | 6.64k | apply(num_packets.received_ecn_counts[1], "num-packets.received-ecn-ect1") \ |
737 | 6.64k | apply(num_packets.received_ecn_counts[2], "num-packets.received-ecn-ce") \ |
738 | 6.64k | apply(num_packets.acked_ecn_counts[0], "num-packets.acked-ecn-ect0") \ |
739 | 6.64k | apply(num_packets.acked_ecn_counts[1], "num-packets.acked-ecn-ect1") \ |
740 | 6.64k | apply(num_packets.acked_ecn_counts[2], "num-packets.acked-ecn-ce") \ |
741 | 6.64k | apply(num_packets.sent_promoted_paths, "num-packets.sent-promoted-paths") \ |
742 | 6.64k | apply(num_packets.ack_received_promoted_paths, "num-packets.ack-received-promoted-paths") \ |
743 | 6.64k | apply(num_packets.max_delayed, "num-packets.max-delayed") \ |
744 | 6.64k | apply(num_packets.delayed_used, "num-packets.delayed-used") |
745 | | |
746 | | #define QUICLY_STATS_FOREACH_NUM_BYTES(apply) \ |
747 | 6.64k | apply(num_bytes.received, "num-bytes.received") \ |
748 | 6.64k | apply(num_bytes.sent, "num-bytes.sent") \ |
749 | 6.64k | apply(num_bytes.lost, "num-bytes.lost") \ |
750 | 6.64k | apply(num_bytes.ack_received, "num-bytes.ack-received") \ |
751 | 6.64k | apply(num_bytes.stream_data_sent, "num-bytes.stream-data-sent") \ |
752 | 6.64k | apply(num_bytes.stream_data_resent, "num-bytes.stream-data-resent") |
753 | | |
754 | | #define QUICLY_STATS__DO_FOREACH_NUM_FRAMES(name, dir, apply) \ |
755 | 332k | apply(num_frames_##dir.name, "num-frames-" PTLS_TO_STR(dir) "." PTLS_TO_STR(name)) |
756 | | |
757 | | #define QUICLY_STATS_FOREACH_NUM_FRAMES(dir, apply) \ |
758 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(padding, dir, apply) \ |
759 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(ping, dir, apply) \ |
760 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(ack, dir, apply) \ |
761 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(reset_stream, dir, apply) \ |
762 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(stop_sending, dir, apply) \ |
763 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(crypto, dir, apply) \ |
764 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(new_token, dir, apply) \ |
765 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(stream, dir, apply) \ |
766 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(max_data, dir, apply) \ |
767 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(max_stream_data, dir, apply) \ |
768 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(max_streams_bidi, dir, apply) \ |
769 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(max_streams_uni, dir, apply) \ |
770 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(data_blocked, dir, apply) \ |
771 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(stream_data_blocked, dir, apply) \ |
772 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(streams_blocked, dir, apply) \ |
773 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(new_connection_id, dir, apply) \ |
774 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(retire_connection_id, dir, apply) \ |
775 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(path_challenge, dir, apply) \ |
776 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(path_response, dir, apply) \ |
777 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(transport_close, dir, apply) \ |
778 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(application_close, dir, apply) \ |
779 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(handshake_done, dir, apply) \ |
780 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(datagram, dir, apply) \ |
781 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(ack_frequency, dir, apply) \ |
782 | 13.2k | QUICLY_STATS__DO_FOREACH_NUM_FRAMES(immediate_ack, dir, apply) |
783 | | |
784 | | #define QUICLY_STATS_FOREACH_TRANSPORT_COUNTERS(apply) \ |
785 | 6.64k | apply(num_paths.created, "num-paths.created") \ |
786 | 6.64k | apply(num_paths.validated, "num-paths.validated") \ |
787 | 6.64k | apply(num_paths.validation_failed, "num-paths.validation-failed") \ |
788 | 6.64k | apply(num_paths.migration_elicited, "num-paths.migration-elicited") \ |
789 | 6.64k | apply(num_paths.promoted, "num-paths.promoted") \ |
790 | 6.64k | apply(num_paths.closed_no_dcid, "num-paths.closed-no-dcid") \ |
791 | 6.64k | apply(num_paths.ecn_validated, "num-paths.ecn-validated") \ |
792 | 6.64k | apply(num_paths.ecn_failed, "num-paths.ecn-failed") \ |
793 | 6.64k | apply(num_ptos, "num-ptos") \ |
794 | 6.64k | apply(num_handshake_timeouts, "num-handshake-timeouts") \ |
795 | 6.64k | apply(num_initial_handshake_exceeded, "num-initial-handshake-exceeded") \ |
796 | 6.64k | apply(num_jumpstart_applicable, "num-jumpstart-applicable") \ |
797 | 6.64k | apply(num_rapid_start, "num-rapid-start") \ |
798 | 6.64k | apply(num_paced, "num-paced") \ |
799 | 6.64k | apply(num_respected_app_limited, "num-respected-app-limited") |
800 | | |
801 | | /** |
802 | | * Macro for iterating QUICLY_STATS_PREBUILT_COUNTERS. |
803 | | */ |
804 | | #define QUICLY_STATS_FOREACH_COUNTERS(apply) \ |
805 | 6.64k | QUICLY_STATS_FOREACH_NUM_PACKETS(apply) \ |
806 | 6.64k | QUICLY_STATS_FOREACH_NUM_BYTES(apply) \ |
807 | 6.64k | QUICLY_STATS_FOREACH_NUM_FRAMES(received, apply) \ |
808 | 6.64k | QUICLY_STATS_FOREACH_NUM_FRAMES(sent, apply) \ |
809 | 6.64k | QUICLY_STATS_FOREACH_TRANSPORT_COUNTERS(apply) |
810 | | |
811 | | /** |
812 | | * Macro for iterating the fields of `quicly_stats_t` other than QUICLY_STATS_PREBUILT_COUNTERS. |
813 | | */ |
814 | | #define QUICLY_STATS_FOREACH_NON_COUNTERS(apply) \ |
815 | 0 | apply(handshake_confirmed_msec, "handshake-confirmed-msec") \ |
816 | 0 | apply(jumpstart.prev_rate, "jumpstart.prev-rate") \ |
817 | 0 | apply(jumpstart.prev_rtt, "jumpstart.prev-rtt") \ |
818 | 0 | apply(jumpstart.new_rtt, "jumpstart.new-rtt") \ |
819 | 0 | apply(jumpstart.cwnd, "jumpstart.cwnd") \ |
820 | 0 | apply(token_sent.at, "token-sent.at") \ |
821 | 0 | apply(token_sent.rate, "token-sent.rate") \ |
822 | 0 | apply(token_sent.rtt, "token-sent.rtt") \ |
823 | 0 | apply(rtt.minimum, "rtt.minimum") \ |
824 | 0 | apply(rtt.smoothed, "rtt.smoothed") \ |
825 | 0 | apply(rtt.variance, "rtt.variance") \ |
826 | 0 | apply(rtt.latest, "rtt.latest") \ |
827 | 0 | apply(loss_thresholds.use_packet_based, "loss-thresholds.use-packet-based") \ |
828 | 0 | apply(loss_thresholds.time_based_percentile, "loss-thresholds.time-based-percentile") \ |
829 | 0 | apply(cc.cwnd, "cc.cwnd") \ |
830 | 0 | apply(cc.ssthresh, "cc.ssthresh") \ |
831 | 0 | apply(cc.cwnd_initial, "cc.cwnd-initial") \ |
832 | 0 | apply(cc.cwnd_exiting_slow_start, "cc.cwnd-exiting-slow-start") \ |
833 | 0 | apply(cc.exit_slow_start_at, "cc.exit-slow-start-at") \ |
834 | 0 | apply(cc.cwnd_exiting_jumpstart, "cc.cwnd-exiting-jumpstart") \ |
835 | 0 | apply(cc.cwnd_minimum, "cc.cwnd-minimum") \ |
836 | 0 | apply(cc.cwnd_maximum, "cc.cwnd-maximum") \ |
837 | 0 | apply(cc.num_loss_episodes, "cc.num-loss-episodes") \ |
838 | 0 | apply(cc.num_loss_episodes_undone, "cc.num-loss-episodes-undone") \ |
839 | 0 | apply(cc.num_loss_episodes_undone_in_startup, "cc.num-loss-episodes-undone-in-startup") \ |
840 | 0 | apply(cc.num_ecn_loss_episodes, "cc.num-ecn-loss-episodes") \ |
841 | 0 | apply(delivery_rate.latest, "delivery-rate.latest") \ |
842 | 0 | apply(delivery_rate.smoothed, "delivery-rate.smoothed") \ |
843 | 0 | apply(delivery_rate.stdev, "delivery-rate.stdev") \ |
844 | 0 | apply(num_sentmap_packets_largest, "num-sentmap-packets-largest") |
845 | | |
846 | | #define QUICLY_STATS_FOREACH(apply) \ |
847 | 0 | QUICLY_STATS_FOREACH_COUNTERS(apply) \ |
848 | 0 | QUICLY_STATS_FOREACH_NON_COUNTERS(apply) |
849 | | |
850 | | /* clang-format on */ |
851 | | |
852 | | /** |
853 | | * The state of the default stream scheduler. |
854 | | * `active` is a linked-list of streams for which STREAM frames can be emitted. `blocked` is a linked-list of streams that have |
855 | | * something to be sent but are currently blocked by the connection-level flow control. |
856 | | * When the `can_send` callback of the default stream scheduler is invoked with the `conn_is_saturated` flag set, connections that |
857 | | * are blocked are eventually moved to the `blocked` list. When the callback is invoked without the flag being set, all the |
858 | | * connections in the `blocked` list is moved to the `active` list and the `in_saturated_mode` is cleared. |
859 | | */ |
860 | | struct st_quicly_default_scheduler_state_t { |
861 | | quicly_linklist_t active; |
862 | | quicly_linklist_t blocked; |
863 | | }; |
864 | | |
865 | | typedef void (*quicly_trace_cb)(void *ctx, const char *fmt, ...) __attribute__((format(printf, 2, 3))); |
866 | | |
867 | | struct _st_quicly_conn_public_t { |
868 | | quicly_context_t *ctx; |
869 | | quicly_state_t state; |
870 | | struct { |
871 | | /** |
872 | | * connection IDs being issued to the remote peer. |
873 | | * `quicly_conn_public_t::local.cid_set.plaintext.master_id has to be located right after `ctx` and `state`, as probes rely |
874 | | * on that assumption. |
875 | | */ |
876 | | quicly_local_cid_set_t cid_set; |
877 | | /** |
878 | | * the SCID used in long header packets. Equivalent to local_cid[seq=0]. Retaining the value separately is the easiest way |
879 | | * of staying away from the complexity caused by remote peer sending RCID frames before the handshake concludes. |
880 | | */ |
881 | | quicly_cid_t long_header_src_cid; |
882 | | /** |
883 | | * stream-level limits |
884 | | */ |
885 | | struct st_quicly_conn_streamgroup_state_t bidi, uni; |
886 | | } local; |
887 | | struct { |
888 | | /** |
889 | | * CIDs received from the remote peer |
890 | | */ |
891 | | quicly_remote_cid_set_t cid_set; |
892 | | struct st_quicly_conn_streamgroup_state_t bidi, uni; |
893 | | quicly_transport_parameters_t transport_params; |
894 | | struct { |
895 | | unsigned validated : 1; |
896 | | unsigned send_probe : 1; |
897 | | } address_validation; |
898 | | } remote; |
899 | | /** |
900 | | * Retains the original DCID used by the client. Servers use this to route incoming packets. Clients use this when validating |
901 | | * the Transport Parameters sent by the server. |
902 | | */ |
903 | | quicly_cid_t original_dcid; |
904 | | struct st_quicly_default_scheduler_state_t _default_scheduler; |
905 | | struct { |
906 | | QUICLY_STATS_PREBUILT_FIELDS; |
907 | | } stats; |
908 | | uint32_t version; |
909 | | void *data; |
910 | | /** |
911 | | * trace callback (cb != NULL when used) |
912 | | */ |
913 | | quicly_tracer_t tracer; |
914 | | }; |
915 | | |
916 | | typedef enum { |
917 | | /** |
918 | | * initial state |
919 | | */ |
920 | | QUICLY_SENDER_STATE_NONE, |
921 | | /** |
922 | | * to be sent. Changes to UNACKED when sent out by quicly_send |
923 | | */ |
924 | | QUICLY_SENDER_STATE_SEND, |
925 | | /** |
926 | | * inflight. changes to SEND (when packet is deemed lost), or ACKED (when packet is ACKed) |
927 | | */ |
928 | | QUICLY_SENDER_STATE_UNACKED, |
929 | | /** |
930 | | * the sent value acknowledged by remote peer |
931 | | */ |
932 | | QUICLY_SENDER_STATE_ACKED, |
933 | | } quicly_sender_state_t; |
934 | | |
935 | | /** |
936 | | * API that allows applications to specify it's own send / receive buffer. The callback should be assigned by the |
937 | | * `quicly_context_t::on_stream_open` callback. |
938 | | */ |
939 | | typedef struct st_quicly_stream_callbacks_t { |
940 | | /** |
941 | | * called when the stream is destroyed |
942 | | */ |
943 | | void (*on_destroy)(quicly_stream_t *stream, quicly_error_t err); |
944 | | /** |
945 | | * called whenever data can be retired from the send buffer, specifying the amount that can be newly removed |
946 | | */ |
947 | | void (*on_send_shift)(quicly_stream_t *stream, size_t delta); |
948 | | /** |
949 | | * asks the application to fill the frame payload. `off` is the offset within the buffer (the beginning position of the buffer |
950 | | * changes as `on_send_shift` is invoked). `len` is an in/out argument that specifies the size of the buffer / amount of data |
951 | | * being written. `wrote_all` is a boolean out parameter indicating if the application has written all the available data. |
952 | | * As this callback is triggered by calling quicly_stream_sync_sendbuf (stream, 1) when tx data is present, it assumes data |
953 | | * to be available - that is `len` return value should be non-zero. |
954 | | */ |
955 | | void (*on_send_emit)(quicly_stream_t *stream, size_t off, void *dst, size_t *len, int *wrote_all); |
956 | | /** |
957 | | * called when a STOP_SENDING frame is received. Do not call `quicly_reset_stream` in response. The stream will be |
958 | | * automatically reset by quicly. |
959 | | */ |
960 | | void (*on_send_stop)(quicly_stream_t *stream, quicly_error_t err); |
961 | | /** |
962 | | * called when data is newly received. `off` is the offset within the buffer (the beginning position changes as the application |
963 | | * calls `quicly_stream_sync_recvbuf`. Applications should consult `quicly_stream_t::recvstate` to see if it has contiguous |
964 | | * input. |
965 | | */ |
966 | | void (*on_receive)(quicly_stream_t *stream, size_t off, const void *src, size_t len); |
967 | | /** |
968 | | * called when a RESET_STREAM frame is received |
969 | | */ |
970 | | void (*on_receive_reset)(quicly_stream_t *stream, quicly_error_t err); |
971 | | } quicly_stream_callbacks_t; |
972 | | |
973 | | struct st_quicly_stream_t { |
974 | | /** |
975 | | * |
976 | | */ |
977 | | quicly_conn_t *conn; |
978 | | /** |
979 | | * stream id |
980 | | */ |
981 | | quicly_stream_id_t stream_id; |
982 | | /** |
983 | | * |
984 | | */ |
985 | | const quicly_stream_callbacks_t *callbacks; |
986 | | /** |
987 | | * send buffer |
988 | | */ |
989 | | quicly_sendstate_t sendstate; |
990 | | /** |
991 | | * receive buffer |
992 | | */ |
993 | | quicly_recvstate_t recvstate; |
994 | | /** |
995 | | * |
996 | | */ |
997 | | void *data; |
998 | | /** |
999 | | * |
1000 | | */ |
1001 | | unsigned streams_blocked : 1; |
1002 | | /** |
1003 | | * |
1004 | | */ |
1005 | | struct { |
1006 | | /** |
1007 | | * send window |
1008 | | */ |
1009 | | uint64_t max_stream_data; |
1010 | | /** |
1011 | | * |
1012 | | */ |
1013 | | struct { |
1014 | | quicly_sender_state_t sender_state; |
1015 | | uint64_t error_code; |
1016 | | } stop_sending; |
1017 | | /** |
1018 | | * reset_stream |
1019 | | */ |
1020 | | struct { |
1021 | | /** |
1022 | | * STATE_NONE until RST is generated |
1023 | | */ |
1024 | | quicly_sender_state_t sender_state; |
1025 | | uint64_t error_code; |
1026 | | } reset_stream; |
1027 | | /** |
1028 | | * sends receive window updates to remote peer |
1029 | | */ |
1030 | | quicly_maxsender_t max_stream_data_sender; |
1031 | | /** |
1032 | | * send state of STREAM_DATA_BLOCKED frames corresponding to the current max_stream_data value |
1033 | | */ |
1034 | | quicly_sender_state_t blocked; |
1035 | | /** |
1036 | | * linklist of pending streams |
1037 | | */ |
1038 | | struct { |
1039 | | quicly_linklist_t control; /* links to conn_t::control (or to conn_t::streams_blocked if the blocked flag is set) */ |
1040 | | quicly_linklist_t default_scheduler; |
1041 | | } pending_link; |
1042 | | } _send_aux; |
1043 | | /** |
1044 | | * |
1045 | | */ |
1046 | | struct { |
1047 | | /** |
1048 | | * size of the receive window |
1049 | | */ |
1050 | | uint32_t window; |
1051 | | /** |
1052 | | * Maximum number of ranges (i.e. gaps + 1) permitted in `recvstate.ranges`. |
1053 | | * As discussed in https://github.com/h2o/quicly/issues/278, this value should be proportional to the size of the receive |
1054 | | * window, so that the receive window can be maintained even in the worst case, where every one of the two packets being |
1055 | | * sent are received. |
1056 | | */ |
1057 | | uint32_t max_ranges; |
1058 | | } _recv_aux; |
1059 | | }; |
1060 | | |
1061 | | /** |
1062 | | * QUIC packet after decoded by `quicly_decode_packet` for routing. All the pointers within the struct points to the buffer pointed |
1063 | | * to by `.octets`. When adding new pointer members, `adjust_pointers_of_decoded_packet` must be updated as well. |
1064 | | */ |
1065 | | typedef struct st_quicly_decoded_packet_t { |
1066 | | /** |
1067 | | * octets of the entire packet |
1068 | | */ |
1069 | | ptls_iovec_t octets; |
1070 | | /** |
1071 | | * Connection ID(s) |
1072 | | */ |
1073 | | struct { |
1074 | | /** |
1075 | | * destination CID |
1076 | | */ |
1077 | | struct { |
1078 | | /** |
1079 | | * CID visible on wire |
1080 | | */ |
1081 | | ptls_iovec_t encrypted; |
1082 | | /** |
1083 | | * The decrypted CID, or `quicly_cid_plaintext_invalid`. Assuming that `cid_encryptor` is non-NULL, this variable would |
1084 | | * contain a valid value whenever `might_be_client_generated` is false. When `might_be_client_generated` is true, this |
1085 | | * value might be set to `quicly_cid_plaintext_invalid`. Note however that, as the CID itself is not authenticated, |
1086 | | * a packet might be bogus regardless of the value of the CID. |
1087 | | * When `cid_encryptor` is NULL, the value is always set to `quicly_cid_plaintext_invalid`. |
1088 | | */ |
1089 | | quicly_cid_plaintext_t plaintext; |
1090 | | /** |
1091 | | * If destination CID might be one generated by a client. This flag would be set for Initial and 0-RTT packets. |
1092 | | */ |
1093 | | unsigned might_be_client_generated : 1; |
1094 | | } dest; |
1095 | | /** |
1096 | | * source CID; {NULL, 0} if is a short header packet |
1097 | | */ |
1098 | | ptls_iovec_t src; |
1099 | | } cid; |
1100 | | /** |
1101 | | * version; 0 if is a short header packet |
1102 | | */ |
1103 | | uint32_t version; |
1104 | | /** |
1105 | | * token if available; otherwise {NULL, 0} |
1106 | | */ |
1107 | | ptls_iovec_t token; |
1108 | | /** |
1109 | | * starting offset of data (i.e., version-dependent area of a long header packet (version numbers in case of VN), AEAD tag (in |
1110 | | * case of retry), encrypted PN (if decrypted.pn is UINT64_MAX) or data (if decrypted_pn is not UINT64_MAX)) |
1111 | | */ |
1112 | | size_t encrypted_off; |
1113 | | /** |
1114 | | * size of the UDP datagram |
1115 | | */ |
1116 | | size_t datagram_size; |
1117 | | /** |
1118 | | * when decrypted.pn is not UINT64_MAX, indicates that the packet has been decrypted prior to being passed to `quicly_receive`. |
1119 | | */ |
1120 | | struct { |
1121 | | uint64_t pn; |
1122 | | uint64_t key_phase; |
1123 | | } decrypted; |
1124 | | /** |
1125 | | * ECN bits |
1126 | | */ |
1127 | | uint8_t ecn : 2; |
1128 | | /** |
1129 | | * if it is the first packet within the datagram |
1130 | | */ |
1131 | | uint8_t first_packet : 1; |
1132 | | /** |
1133 | | * |
1134 | | */ |
1135 | | enum { |
1136 | | QUICLY__DECODED_PACKET_CACHED_MAYBE_STATELESS_RESET = 0, |
1137 | | QUICLY__DECODED_PACKET_CACHED_IS_STATELESS_RESET, |
1138 | | QUICLY__DECODED_PACKET_CACHED_NOT_STATELESS_RESET |
1139 | | } _is_stateless_reset_cached; |
1140 | | } quicly_decoded_packet_t; |
1141 | | |
1142 | | struct st_quicly_address_token_plaintext_t { |
1143 | | enum { QUICLY_ADDRESS_TOKEN_TYPE_RETRY, QUICLY_ADDRESS_TOKEN_TYPE_RESUMPTION } type; |
1144 | | uint64_t issued_at; |
1145 | | quicly_address_t local, remote; |
1146 | | unsigned address_mismatch : 1; |
1147 | | union { |
1148 | | struct { |
1149 | | quicly_cid_t original_dcid; |
1150 | | quicly_cid_t client_cid; |
1151 | | quicly_cid_t server_cid; |
1152 | | } retry; |
1153 | | struct { |
1154 | | uint8_t bytes[256]; |
1155 | | size_t len; |
1156 | | } resumption; |
1157 | | }; |
1158 | | struct { |
1159 | | uint8_t bytes[256]; |
1160 | | size_t len; |
1161 | | } appdata; |
1162 | | }; |
1163 | | |
1164 | | /** |
1165 | | * zero-terminated list of protocol versions being supported by quicly |
1166 | | */ |
1167 | | extern const uint32_t quicly_supported_versions[]; |
1168 | | /** |
1169 | | * returns a boolean indicating if given protocol version is supported |
1170 | | */ |
1171 | | static int quicly_is_supported_version(uint32_t version); |
1172 | | /** |
1173 | | * Extracts QUIC packets from a datagram pointed to by `src` and `len`. If successful, the function returns the size of the QUIC |
1174 | | * packet being decoded. Otherwise, SIZE_MAX is returned. |
1175 | | * `off` is an I/O argument that takes starting offset of the QUIC packet to be decoded as input, and returns the starting offset of |
1176 | | * the next QUIC packet. A typical loop that handles an UDP datagram would look like: |
1177 | | * |
1178 | | * size_t off = 0; |
1179 | | * while (off < dgram.size) { |
1180 | | * if (quicly_decode_packet(ctx, &packet, dgram.bytes, dgram.size, &off) == SIZE_MAX) |
1181 | | * break; |
1182 | | * handle_quic_packet(&packet); |
1183 | | * } |
1184 | | */ |
1185 | | size_t quicly_decode_packet(quicly_context_t *ctx, quicly_decoded_packet_t *packet, const uint8_t *datagram, size_t datagram_size, |
1186 | | size_t *off); |
1187 | | /** |
1188 | | * |
1189 | | */ |
1190 | | uint64_t quicly_determine_packet_number(uint32_t truncated, size_t num_bits, uint64_t expected); |
1191 | | /** |
1192 | | * |
1193 | | */ |
1194 | | static quicly_context_t *quicly_get_context(quicly_conn_t *conn); |
1195 | | /** |
1196 | | * |
1197 | | */ |
1198 | | static const quicly_cid_plaintext_t *quicly_get_master_id(quicly_conn_t *conn); |
1199 | | /** |
1200 | | * |
1201 | | */ |
1202 | | static const quicly_cid_t *quicly_get_original_dcid(quicly_conn_t *conn); |
1203 | | /** |
1204 | | * |
1205 | | */ |
1206 | | static const quicly_cid_t *quicly_get_remote_cid(quicly_conn_t *conn); |
1207 | | /** |
1208 | | * |
1209 | | */ |
1210 | | static const quicly_transport_parameters_t *quicly_get_remote_transport_parameters(quicly_conn_t *conn); |
1211 | | /** |
1212 | | * |
1213 | | */ |
1214 | | static quicly_state_t quicly_get_state(quicly_conn_t *conn); |
1215 | | /** |
1216 | | * Returns the error code and other information regarding the closure of the connection. The out parameters may be NULL. This |
1217 | | * function must only be called after the the state transitions to QUICLY_STATE_CLOSING or QUICLY_STATE_DRAINING. |
1218 | | */ |
1219 | | quicly_error_t quicly_get_close_reason(quicly_conn_t *conn, uint64_t *offending_frame_type, const char **reason_phrase, |
1220 | | int *is_remote); |
1221 | | /** |
1222 | | * |
1223 | | */ |
1224 | | int quicly_connection_is_ready(quicly_conn_t *conn); |
1225 | | /** |
1226 | | * |
1227 | | */ |
1228 | | static uint32_t quicly_num_streams(quicly_conn_t *conn); |
1229 | | /** |
1230 | | * |
1231 | | */ |
1232 | | uint32_t quicly_num_streams_by_group(quicly_conn_t *conn, int uni, int locally_initiated); |
1233 | | /** |
1234 | | * |
1235 | | */ |
1236 | | static int quicly_is_client(quicly_conn_t *conn); |
1237 | | /** |
1238 | | * |
1239 | | */ |
1240 | | static quicly_stream_id_t quicly_get_local_next_stream_id(quicly_conn_t *conn, int uni); |
1241 | | /** |
1242 | | * |
1243 | | */ |
1244 | | static quicly_stream_id_t quicly_get_remote_next_stream_id(quicly_conn_t *conn, int uni); |
1245 | | /** |
1246 | | * Returns the local address of the connection. This may be AF_UNSPEC, indicating that the operating system is choosing the address. |
1247 | | */ |
1248 | | struct sockaddr *quicly_get_sockname(quicly_conn_t *conn); |
1249 | | /** |
1250 | | * Returns the remote address of the connection. This would never be AF_UNSPEC. |
1251 | | */ |
1252 | | struct sockaddr *quicly_get_peername(quicly_conn_t *conn); |
1253 | | /** |
1254 | | * |
1255 | | */ |
1256 | | quicly_error_t quicly_get_stats(quicly_conn_t *conn, quicly_stats_t *stats); |
1257 | | /** |
1258 | | * |
1259 | | */ |
1260 | | quicly_error_t quicly_get_delivery_rate(quicly_conn_t *conn, quicly_rate_t *delivery_rate); |
1261 | | /** |
1262 | | * |
1263 | | */ |
1264 | | void quicly_get_max_data(quicly_conn_t *conn, uint64_t *send_permitted, uint64_t *sent, uint64_t *consumed, uint64_t *shifted); |
1265 | | /** |
1266 | | * |
1267 | | */ |
1268 | | static uint32_t quicly_get_protocol_version(quicly_conn_t *conn); |
1269 | | /** |
1270 | | * |
1271 | | */ |
1272 | | static void **quicly_get_data(quicly_conn_t *conn); |
1273 | | /** |
1274 | | * |
1275 | | */ |
1276 | | static quicly_tracer_t *quicly_get_tracer(quicly_conn_t *conn); |
1277 | | /** |
1278 | | * destroys a connection object. |
1279 | | */ |
1280 | | void quicly_free(quicly_conn_t *conn); |
1281 | | /** |
1282 | | * closes the connection. `err` is the application error code using the coalesced scheme (see QUICLY_ERROR_* macros), or zero (no |
1283 | | * error; indicating idle close). An application should continue calling quicly_receive and quicly_send, until they return |
1284 | | * QUICLY_ERROR_FREE_CONNECTION. At this point, it is should call quicly_free. |
1285 | | */ |
1286 | | quicly_error_t quicly_close(quicly_conn_t *conn, quicly_error_t err, const char *reason_phrase); |
1287 | | /** |
1288 | | * |
1289 | | */ |
1290 | | int64_t quicly_get_first_timeout(quicly_conn_t *conn); |
1291 | | /** |
1292 | | * |
1293 | | */ |
1294 | | uint64_t quicly_get_next_expected_packet_number(quicly_conn_t *conn); |
1295 | | /** |
1296 | | * returns if the connection is currently blocked by connection-level flow control. |
1297 | | */ |
1298 | | int quicly_is_blocked(quicly_conn_t *conn); |
1299 | | /** |
1300 | | * Returns if stream data can be sent. |
1301 | | * When the connection is blocked by the connection-level flow control (see `quicly_is_blocked`), `at_stream_level` should be set to |
1302 | | * false to see if any retransmissions are to be done. Otherwise, `at_stream_level` should be set to true to test the stream-level |
1303 | | * flow control. |
1304 | | */ |
1305 | | int quicly_stream_can_send(quicly_stream_t *stream, int at_stream_level); |
1306 | | /** |
1307 | | * checks if quicly_send_stream can be invoked |
1308 | | * @return a boolean indicating if quicly_send_stream can be called immediately |
1309 | | */ |
1310 | | int quicly_can_send_data(quicly_conn_t *conn, quicly_send_context_t *s); |
1311 | | /** |
1312 | | * Sends data of given stream. Called by stream scheduler. Only streams that can send some data or EOS should be specified. It is |
1313 | | * the responsibility of the stream scheduler to maintain a list of such streams. |
1314 | | */ |
1315 | | quicly_error_t quicly_send_stream(quicly_stream_t *stream, quicly_send_context_t *s); |
1316 | | /** |
1317 | | * Builds a Version Negotiation packet. The generated packet might include a greasing version. |
1318 | | * * @param versions zero-terminated list of versions to advertise; use `quicly_supported_versions` for sending the list of |
1319 | | * protocol versions supported by quicly |
1320 | | */ |
1321 | | size_t quicly_send_version_negotiation(quicly_context_t *ctx, ptls_iovec_t dest_cid, ptls_iovec_t src_cid, const uint32_t *versions, |
1322 | | void *payload); |
1323 | | /** |
1324 | | * |
1325 | | */ |
1326 | | quicly_error_t quicly_retry_calc_cidpair_hash(ptls_hash_algorithm_t *sha256, ptls_iovec_t client_cid, ptls_iovec_t server_cid, |
1327 | | uint64_t *value); |
1328 | | /** |
1329 | | * Builds a UDP datagram containing a Retry packet. |
1330 | | * @param retry_aead_cache pointer to `ptls_aead_context_t *` that the function can store a AEAD context for future reuse. The |
1331 | | * cache cannot be shared between multiple threads. Can be set to NULL when caching is unnecessary. |
1332 | | * @param payload buffer used for building the packet |
1333 | | * @return size of the UDP datagram payload being built, or otherwise SIZE_MAX to indicate failure |
1334 | | */ |
1335 | | size_t quicly_send_retry(quicly_context_t *ctx, ptls_aead_context_t *token_encrypt_ctx, uint32_t protocol_version, |
1336 | | struct sockaddr *dest_addr, ptls_iovec_t dest_cid, struct sockaddr *src_addr, ptls_iovec_t src_cid, |
1337 | | ptls_iovec_t odcid, ptls_iovec_t token_prefix, ptls_iovec_t appdata, |
1338 | | ptls_aead_context_t **retry_aead_cache, uint8_t *payload); |
1339 | | /** |
1340 | | * Builds UDP datagrams to be sent for given connection. |
1341 | | * @param [out] dest destination address |
1342 | | * @param [out] src source address |
1343 | | * @param [out] datagrams vector of iovecs pointing to the payloads of UDP datagrams. Each iovec represents a single UDP |
1344 | | * datagram. |
1345 | | * @param [in,out] num_datagrams Upon entry, the application provides the number of entries that the `packets` vector can contain. |
1346 | | * Upon return, contains the number of packet vectors emitted by `quicly_send`. |
1347 | | * @param buf buffer used for building UDP datagrams. It is guaranteed that the first datagram would be built |
1348 | | * from the address provided by `buf`, and that succeeding packets (if any) will be contiguously laid |
1349 | | * out. This constraint reduces the number of vectors that need to be passed to the kernel when using |
1350 | | * GSO. |
1351 | | * @return 0 if successful, otherwise an error. When an error is returned, the caller must call `quicly_close` to discard the |
1352 | | * connection context. |
1353 | | */ |
1354 | | quicly_error_t quicly_send(quicly_conn_t *conn, quicly_address_t *dest, quicly_address_t *src, struct iovec *datagrams, |
1355 | | size_t *num_datagrams, void *buf, size_t bufsize); |
1356 | | /** |
1357 | | * returns ECN bits to be set for the packets built by the last invocation of `quicly_send` |
1358 | | */ |
1359 | | uint8_t quicly_send_get_ecn_bits(quicly_conn_t *conn); |
1360 | | /** |
1361 | | * |
1362 | | */ |
1363 | | size_t quicly_send_close_invalid_token(quicly_context_t *ctx, uint32_t protocol_version, ptls_iovec_t dest_cid, |
1364 | | ptls_iovec_t src_cid, const char *err_desc, void *datagram); |
1365 | | /** |
1366 | | * |
1367 | | */ |
1368 | | size_t quicly_send_stateless_reset(quicly_context_t *ctx, const void *src_cid, void *payload); |
1369 | | /** |
1370 | | * |
1371 | | */ |
1372 | | quicly_error_t quicly_send_resumption_token(quicly_conn_t *conn); |
1373 | | /** |
1374 | | * |
1375 | | */ |
1376 | | quicly_error_t quicly_receive(quicly_conn_t *conn, struct sockaddr *dest_addr, struct sockaddr *src_addr, |
1377 | | quicly_decoded_packet_t *packet); |
1378 | | /** |
1379 | | * consults if the incoming packet identified by (dest_addr, src_addr, decoded) belongs to the given connection |
1380 | | */ |
1381 | | int quicly_is_destination(quicly_conn_t *conn, struct sockaddr *dest_addr, struct sockaddr *src_addr, |
1382 | | quicly_decoded_packet_t *decoded); |
1383 | | /** |
1384 | | * returns salts given version |
1385 | | */ |
1386 | | const quicly_salt_t *quicly_get_salt(uint32_t protocol_version); |
1387 | | /** |
1388 | | * |
1389 | | */ |
1390 | | int quicly_calc_initial_keys(ptls_cipher_suite_t *cs, uint8_t *ingress, uint8_t *egress, ptls_iovec_t cid, int is_client, |
1391 | | ptls_iovec_t salt); |
1392 | | /** |
1393 | | * |
1394 | | */ |
1395 | | int quicly_encode_transport_parameter_list(ptls_buffer_t *buf, const quicly_transport_parameters_t *params, |
1396 | | const quicly_cid_t *original_dcid, const quicly_cid_t *initial_scid, |
1397 | | const quicly_cid_t *retry_scid, const void *stateless_reset_token, size_t expand_by); |
1398 | | /** |
1399 | | * Decodes the Transport Parameters. |
1400 | | * For the four optional output parameters (`original_dcid`, `initial_scid`, `retry_scid`, `stateless_reset_token`), this function |
1401 | | * returns an error if NULL were supplied as the arguments and the corresponding Transport Parameters were received. |
1402 | | * If corresponding Transport Parameters were not found for any of the non-null connection ID slots, an error is returned. |
1403 | | * Stateless reset is an optional feature of QUIC, and therefore no error is returned when the vector for storing the token is |
1404 | | * provided and the corresponding Transport Parameter is missing. In that case, the provided vector remains unmodified. The caller |
1405 | | * pre-fills the vector with an unpredictable value (i.e. random), then calls this function to set the stateless reset token to the |
1406 | | * value supplied by peer. |
1407 | | */ |
1408 | | quicly_error_t quicly_decode_transport_parameter_list(quicly_transport_parameters_t *params, quicly_cid_t *original_dcid, |
1409 | | quicly_cid_t *initial_scid, quicly_cid_t *retry_scid, |
1410 | | void *stateless_reset_token, const uint8_t *src, const uint8_t *end); |
1411 | | /** |
1412 | | * Initiates a new connection. |
1413 | | * @param new_cid the CID to be used for the connection. path_id is ignored. |
1414 | | * @param appdata initial value to be set to `*quicly_get_data(conn)` |
1415 | | */ |
1416 | | quicly_error_t quicly_connect(quicly_conn_t **conn, quicly_context_t *ctx, const char *server_name, struct sockaddr *dest_addr, |
1417 | | struct sockaddr *src_addr, const quicly_cid_plaintext_t *new_cid, ptls_iovec_t address_token, |
1418 | | ptls_handshake_properties_t *handshake_properties, |
1419 | | const quicly_transport_parameters_t *resumed_transport_params, void *appdata); |
1420 | | /** |
1421 | | * accepts a new connection |
1422 | | * @param new_cid The CID to be used for the connection. When an error is being returned, the application can reuse the CID |
1423 | | * provided to the function. |
1424 | | * @param address_token An validated address validation token, if any. Applications MUST validate the address validation token |
1425 | | * before calling this function, dropping the ones that failed to validate. When a token is supplied, |
1426 | | * `quicly_accept` will consult the values being supplied assuming that the remote peer's address has been |
1427 | | * validated. |
1428 | | * @param appdata initial value to be set to `*quicly_get_data(conn)` |
1429 | | */ |
1430 | | quicly_error_t quicly_accept(quicly_conn_t **conn, quicly_context_t *ctx, struct sockaddr *dest_addr, struct sockaddr *src_addr, |
1431 | | quicly_decoded_packet_t *packet, quicly_address_token_plaintext_t *address_token, |
1432 | | const quicly_cid_plaintext_t *new_cid, ptls_handshake_properties_t *handshake_properties, |
1433 | | void *appdata); |
1434 | | /** |
1435 | | * |
1436 | | */ |
1437 | | ptls_t *quicly_get_tls(quicly_conn_t *conn); |
1438 | | /** |
1439 | | * Resumes an async TLS handshake, and returns a pointer to the QUIC connection or NULL if the corresponding QUIC connection has |
1440 | | * been discarded. See `quicly_async_handshake_t`. |
1441 | | */ |
1442 | | quicly_conn_t *quicly_resume_handshake(ptls_t *tls); |
1443 | | /** |
1444 | | * |
1445 | | */ |
1446 | | quicly_stream_id_t quicly_get_ingress_max_streams(quicly_conn_t *conn, int uni); |
1447 | | /** |
1448 | | * Iterates through each stream. When the callback returns a non-zero value, bails out from the iteration, returning the returned |
1449 | | * value. |
1450 | | */ |
1451 | | int64_t quicly_foreach_stream(quicly_conn_t *conn, void *thunk, int64_t (*cb)(void *thunk, quicly_stream_t *stream)); |
1452 | | /** |
1453 | | * |
1454 | | */ |
1455 | | quicly_stream_t *quicly_get_stream(quicly_conn_t *conn, quicly_stream_id_t stream_id); |
1456 | | /** |
1457 | | * |
1458 | | */ |
1459 | | quicly_error_t quicly_open_stream(quicly_conn_t *conn, quicly_stream_t **stream, int unidirectional); |
1460 | | /** |
1461 | | * This function returns a stream that is already open, or if the given ID refers to a stream that can be opened by the peer but is |
1462 | | * yet-to-be opened, the functions opens that stream and returns it. Otherwise, `*stream` is set to NULL. |
1463 | | * This function can be used when implementing application protocols that send references to other streams on a stream (e.g., |
1464 | | * PRIORITY_UPDATE frame of HTTP/3), however note that the peer might complain if the endpoint sends a frame that refers to a peer- |
1465 | | * initiated stream for which the peer has not yet sent anything. |
1466 | | * Invocation of this function might open not only the stream that is referred to by the `stream_id` but also other streams. |
1467 | | */ |
1468 | | quicly_error_t quicly_get_or_open_stream(quicly_conn_t *conn, uint64_t stream_id, quicly_stream_t **stream); |
1469 | | /** |
1470 | | * |
1471 | | */ |
1472 | | void quicly_reset_stream(quicly_stream_t *stream, quicly_error_t err); |
1473 | | /** |
1474 | | * |
1475 | | */ |
1476 | | void quicly_request_stop(quicly_stream_t *stream, quicly_error_t err); |
1477 | | /** |
1478 | | * |
1479 | | */ |
1480 | | static int quicly_stop_requested(quicly_stream_t *stream); |
1481 | | /** |
1482 | | * |
1483 | | */ |
1484 | | int quicly_stream_sync_sendbuf(quicly_stream_t *stream, int activate); |
1485 | | /** |
1486 | | * |
1487 | | */ |
1488 | | void quicly_stream_sync_recvbuf(quicly_stream_t *stream, size_t shift_amount); |
1489 | | /** |
1490 | | * |
1491 | | */ |
1492 | | static uint32_t quicly_stream_get_receive_window(quicly_stream_t *stream); |
1493 | | /** |
1494 | | * |
1495 | | */ |
1496 | | static void quicly_stream_set_receive_window(quicly_stream_t *stream, uint32_t window); |
1497 | | /** |
1498 | | * |
1499 | | */ |
1500 | | static int quicly_stream_is_client_initiated(quicly_stream_id_t stream_id); |
1501 | | /** |
1502 | | * |
1503 | | */ |
1504 | | static int quicly_stream_is_unidirectional(quicly_stream_id_t stream_id); |
1505 | | /** |
1506 | | * |
1507 | | */ |
1508 | | static int quicly_stream_has_send_side(int is_client, quicly_stream_id_t stream_id); |
1509 | | /** |
1510 | | * |
1511 | | */ |
1512 | | static int quicly_stream_has_receive_side(int is_client, quicly_stream_id_t stream_id); |
1513 | | /** |
1514 | | * |
1515 | | */ |
1516 | | static int quicly_stream_is_self_initiated(quicly_stream_t *stream); |
1517 | | /** |
1518 | | * Sends QUIC DATAGRAM frames. Some of the frames being provided may get dropped. |
1519 | | * Notes: |
1520 | | * * At the moment, emission of QUIC packets carrying DATAGRAM frames is not congestion controlled. |
1521 | | * * While the API is designed to look like synchronous, application still has to call `quicly_send` for the time being. |
1522 | | */ |
1523 | | void quicly_send_datagram_frames(quicly_conn_t *conn, ptls_iovec_t *datagrams, size_t num_datagrams); |
1524 | | /** |
1525 | | * Sets CC to the specified type. Returns a boolean indicating if the operation was successful. |
1526 | | */ |
1527 | | int quicly_set_cc(quicly_conn_t *conn, quicly_cc_type_t *cc); |
1528 | | /** |
1529 | | * |
1530 | | */ |
1531 | | void quicly_amend_ptls_context(ptls_context_t *ptls); |
1532 | | /** |
1533 | | * Encrypts an address token by serializing the plaintext structure and appending an authentication tag. |
1534 | | * |
1535 | | * @param random_bytes PRNG |
1536 | | * @param aead the AEAD context to be used for decrypting the token |
1537 | | * @param buf buffer to where the token being built is appended |
1538 | | * @param start_off Specifies the start offset of the token. When `start_off < buf->off`, the bytes in between will be |
1539 | | * considered as part of the token and will be covered by the AEAD. Applications can use this location to embed |
1540 | | * the identifier of the AEAD key being used. |
1541 | | * @param plaintext the token to be encrypted |
1542 | | */ |
1543 | | quicly_error_t quicly_encrypt_address_token(void (*random_bytes)(void *, size_t), ptls_aead_context_t *aead, ptls_buffer_t *buf, |
1544 | | size_t start_off, const quicly_address_token_plaintext_t *plaintext); |
1545 | | /** |
1546 | | * Decrypts an address token. |
1547 | | * If decryption succeeds, returns zero. If the token is unusable due to decryption failure, returns PTLS_DECODE_ERROR. If the token |
1548 | | * is unusable and the connection should be reset, returns QUICLY_ERROR_INVALID_TOKEN. |
1549 | | */ |
1550 | | quicly_error_t quicly_decrypt_address_token(ptls_aead_context_t *aead, quicly_address_token_plaintext_t *plaintext, const void *src, |
1551 | | size_t len, size_t prefix_len, const char **err_desc); |
1552 | | /** |
1553 | | * Builds authentication data for TLS session ticket. 0-RTT can be accepted only when the auth_data of the original connection and |
1554 | | * the new connection are identical. |
1555 | | */ |
1556 | | int quicly_build_session_ticket_auth_data(ptls_buffer_t *auth_data, const quicly_context_t *ctx); |
1557 | | /** |
1558 | | * |
1559 | | */ |
1560 | | static void quicly_byte_to_hex(char *dst, uint8_t v); |
1561 | | /** |
1562 | | * |
1563 | | */ |
1564 | | socklen_t quicly_get_socklen(struct sockaddr *sa); |
1565 | | /** |
1566 | | * Builds a safe string. Supplied buffer MUST be 4x + 1 bytes bigger than the input. |
1567 | | */ |
1568 | | char *quicly_escape_unsafe_string(char *dst, const void *bytes, size_t len); |
1569 | | /** |
1570 | | * |
1571 | | */ |
1572 | | char *quicly_hexdump(const uint8_t *bytes, size_t len, size_t indent); |
1573 | | /** |
1574 | | * |
1575 | | */ |
1576 | | void quicly_stream_noop_on_destroy(quicly_stream_t *stream, quicly_error_t err); |
1577 | | /** |
1578 | | * |
1579 | | */ |
1580 | | void quicly_stream_noop_on_send_shift(quicly_stream_t *stream, size_t delta); |
1581 | | /** |
1582 | | * |
1583 | | */ |
1584 | | void quicly_stream_noop_on_send_emit(quicly_stream_t *stream, size_t off, void *dst, size_t *len, int *wrote_all); |
1585 | | /** |
1586 | | * |
1587 | | */ |
1588 | | void quicly_stream_noop_on_send_stop(quicly_stream_t *stream, quicly_error_t err); |
1589 | | /** |
1590 | | * |
1591 | | */ |
1592 | | void quicly_stream_noop_on_receive(quicly_stream_t *stream, size_t off, const void *src, size_t len); |
1593 | | /** |
1594 | | * |
1595 | | */ |
1596 | | void quicly_stream_noop_on_receive_reset(quicly_stream_t *stream, quicly_error_t err); |
1597 | | |
1598 | | extern const quicly_stream_callbacks_t quicly_stream_noop_callbacks; |
1599 | | |
1600 | | #define QUICLY_LOG_CONN(_name, _conn, _block) \ |
1601 | 0 | do { \ |
1602 | 0 | PTLS_LOG_DEFINE_POINT(quicly, _name, logpoint); \ |
1603 | 0 | uint32_t active = ptls_log_point_maybe_active(&logpoint); \ |
1604 | 0 | if (PTLS_LIKELY(active == 0)) \ |
1605 | 0 | break; \ |
1606 | 0 | quicly_conn_t *_c = (_conn); \ |
1607 | 0 | ptls_t *_tls = quicly_get_tls(_c); \ |
1608 | 0 | ptls_log_conn_state_t *conn_state = ptls_get_log_state(_tls); \ |
1609 | 0 | active &= ptls_log_conn_maybe_active(conn_state, ptls_log_getsni_ptls(_tls)); \ |
1610 | 0 | if (PTLS_LIKELY(active == 0)) \ |
1611 | 0 | break; \ |
1612 | 0 | PTLS_LOG__DO_LOG(quicly, _name, conn_state, ptls_log_getsni_ptls(_tls), _c->stash.now == 0, { \ |
1613 | 0 | if (_c->stash.now != 0) \ |
1614 | 0 | PTLS_LOG_ELEMENT_SIGNED(time, _c->stash.now); \ |
1615 | 0 | PTLS_LOG_ELEMENT_PTR(conn, _c); \ |
1616 | 0 | if (conn_state->conn_id != 0) { \ |
1617 | 0 | PTLS_LOG_ELEMENT_UNSIGNED(conn_id, conn_state->conn_id); \ |
1618 | 0 | } \ |
1619 | 0 | do { \ |
1620 | 0 | _block \ |
1621 | 0 | } while (0); \ |
1622 | 0 | }); \ |
1623 | 0 | } while (0) |
1624 | | |
1625 | | /* inline definitions */ |
1626 | | |
1627 | | inline int quicly_is_supported_version(uint32_t version) |
1628 | 0 | { |
1629 | 0 | switch (version) { |
1630 | 0 | case QUICLY_PROTOCOL_VERSION_1: |
1631 | 0 | case QUICLY_PROTOCOL_VERSION_DRAFT29: |
1632 | 0 | case QUICLY_PROTOCOL_VERSION_DRAFT27: |
1633 | 0 | return 1; |
1634 | 0 | default: |
1635 | 0 | return 0; |
1636 | 0 | } |
1637 | 0 | } Unexecuted instantiation: driver.cc:quicly_is_supported_version(unsigned int) Unexecuted instantiation: driver_common.cc:quicly_is_supported_version(unsigned int) Unexecuted instantiation: socket.c:quicly_is_supported_version Unexecuted instantiation: config.c:quicly_is_supported_version Unexecuted instantiation: configurator.c:quicly_is_supported_version Unexecuted instantiation: context.c:quicly_is_supported_version Unexecuted instantiation: headers.c:quicly_is_supported_version Unexecuted instantiation: request.c:quicly_is_supported_version Unexecuted instantiation: util.c:quicly_is_supported_version Unexecuted instantiation: access_log.c:quicly_is_supported_version Unexecuted instantiation: file.c:quicly_is_supported_version Unexecuted instantiation: mimemap.c:quicly_is_supported_version Unexecuted instantiation: proxy.c:quicly_is_supported_version Unexecuted instantiation: http1.c:quicly_is_supported_version Unexecuted instantiation: connection.c:quicly_is_supported_version Unexecuted instantiation: scheduler.c:quicly_is_supported_version Unexecuted instantiation: stream.c:quicly_is_supported_version Unexecuted instantiation: http2_debug_state.c:quicly_is_supported_version Unexecuted instantiation: common.c:quicly_is_supported_version Unexecuted instantiation: server.c:quicly_is_supported_version Unexecuted instantiation: cc-reno.c:quicly_is_supported_version Unexecuted instantiation: defaults.c:quicly_is_supported_version Unexecuted instantiation: quicly.c:quicly_is_supported_version Unexecuted instantiation: streambuf.c:quicly_is_supported_version Unexecuted instantiation: http3client.c:quicly_is_supported_version Unexecuted instantiation: httpclient.c:quicly_is_supported_version Unexecuted instantiation: absprio.c:quicly_is_supported_version Unexecuted instantiation: logconf.c:quicly_is_supported_version Unexecuted instantiation: compress.c:quicly_is_supported_version Unexecuted instantiation: gzip.c:quicly_is_supported_version Unexecuted instantiation: headers_util.c:quicly_is_supported_version Unexecuted instantiation: frame.c:quicly_is_supported_version Unexecuted instantiation: qpack.c:quicly_is_supported_version Unexecuted instantiation: cc-cubic.c:quicly_is_supported_version Unexecuted instantiation: cc-pico.c:quicly_is_supported_version Unexecuted instantiation: http1client.c:quicly_is_supported_version Unexecuted instantiation: http2client.c:quicly_is_supported_version Unexecuted instantiation: pipe_sender.c:quicly_is_supported_version Unexecuted instantiation: driver_url.cc:quicly_is_supported_version(unsigned int) Unexecuted instantiation: driver_h3.cc:quicly_is_supported_version(unsigned int) Unexecuted instantiation: quicly_mock.c:quicly_is_supported_version Unexecuted instantiation: errordoc.c:quicly_is_supported_version Unexecuted instantiation: expires.c:quicly_is_supported_version Unexecuted instantiation: fastcgi.c:quicly_is_supported_version Unexecuted instantiation: h2olog.c:quicly_is_supported_version Unexecuted instantiation: connect.c:quicly_is_supported_version Unexecuted instantiation: redirect.c:quicly_is_supported_version Unexecuted instantiation: reproxy.c:quicly_is_supported_version Unexecuted instantiation: throttle_resp.c:quicly_is_supported_version Unexecuted instantiation: self_trace.c:quicly_is_supported_version Unexecuted instantiation: server_timing.c:quicly_is_supported_version Unexecuted instantiation: status.c:quicly_is_supported_version Unexecuted instantiation: events.c:quicly_is_supported_version Unexecuted instantiation: memory.c:quicly_is_supported_version Unexecuted instantiation: requests.c:quicly_is_supported_version Unexecuted instantiation: ssl.c:quicly_is_supported_version Unexecuted instantiation: durations.c:quicly_is_supported_version Unexecuted instantiation: brotli.c:quicly_is_supported_version |
1638 | | |
1639 | | inline quicly_state_t quicly_get_state(quicly_conn_t *conn) |
1640 | 11.0k | { |
1641 | 11.0k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1642 | 11.0k | return c->state; |
1643 | 11.0k | } Unexecuted instantiation: driver.cc:quicly_get_state(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_state(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_state Unexecuted instantiation: config.c:quicly_get_state Unexecuted instantiation: configurator.c:quicly_get_state Unexecuted instantiation: context.c:quicly_get_state Unexecuted instantiation: headers.c:quicly_get_state Unexecuted instantiation: request.c:quicly_get_state Unexecuted instantiation: util.c:quicly_get_state Unexecuted instantiation: access_log.c:quicly_get_state Unexecuted instantiation: file.c:quicly_get_state Unexecuted instantiation: mimemap.c:quicly_get_state Unexecuted instantiation: proxy.c:quicly_get_state Unexecuted instantiation: http1.c:quicly_get_state Unexecuted instantiation: connection.c:quicly_get_state Unexecuted instantiation: scheduler.c:quicly_get_state Unexecuted instantiation: stream.c:quicly_get_state Unexecuted instantiation: http2_debug_state.c:quicly_get_state common.c:quicly_get_state Line | Count | Source | 1640 | 11.0k | { | 1641 | 11.0k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1642 | 11.0k | return c->state; | 1643 | 11.0k | } |
Unexecuted instantiation: server.c:quicly_get_state Unexecuted instantiation: cc-reno.c:quicly_get_state Unexecuted instantiation: defaults.c:quicly_get_state Unexecuted instantiation: quicly.c:quicly_get_state Unexecuted instantiation: streambuf.c:quicly_get_state Unexecuted instantiation: http3client.c:quicly_get_state Unexecuted instantiation: httpclient.c:quicly_get_state Unexecuted instantiation: absprio.c:quicly_get_state Unexecuted instantiation: logconf.c:quicly_get_state Unexecuted instantiation: compress.c:quicly_get_state Unexecuted instantiation: gzip.c:quicly_get_state Unexecuted instantiation: headers_util.c:quicly_get_state Unexecuted instantiation: frame.c:quicly_get_state Unexecuted instantiation: qpack.c:quicly_get_state Unexecuted instantiation: cc-cubic.c:quicly_get_state Unexecuted instantiation: cc-pico.c:quicly_get_state Unexecuted instantiation: http1client.c:quicly_get_state Unexecuted instantiation: http2client.c:quicly_get_state Unexecuted instantiation: pipe_sender.c:quicly_get_state Unexecuted instantiation: driver_url.cc:quicly_get_state(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_state(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_state Unexecuted instantiation: errordoc.c:quicly_get_state Unexecuted instantiation: expires.c:quicly_get_state Unexecuted instantiation: fastcgi.c:quicly_get_state Unexecuted instantiation: h2olog.c:quicly_get_state Unexecuted instantiation: connect.c:quicly_get_state Unexecuted instantiation: redirect.c:quicly_get_state Unexecuted instantiation: reproxy.c:quicly_get_state Unexecuted instantiation: throttle_resp.c:quicly_get_state Unexecuted instantiation: self_trace.c:quicly_get_state Unexecuted instantiation: server_timing.c:quicly_get_state Unexecuted instantiation: status.c:quicly_get_state Unexecuted instantiation: events.c:quicly_get_state Unexecuted instantiation: memory.c:quicly_get_state Unexecuted instantiation: requests.c:quicly_get_state Unexecuted instantiation: ssl.c:quicly_get_state Unexecuted instantiation: durations.c:quicly_get_state Unexecuted instantiation: brotli.c:quicly_get_state |
1644 | | |
1645 | | inline uint32_t quicly_num_streams(quicly_conn_t *conn) |
1646 | 8.92k | { |
1647 | 8.92k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1648 | 8.92k | return c->local.bidi.num_streams + c->local.uni.num_streams + c->remote.bidi.num_streams + c->remote.uni.num_streams; |
1649 | 8.92k | } Unexecuted instantiation: driver.cc:quicly_num_streams(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_num_streams(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_num_streams Unexecuted instantiation: config.c:quicly_num_streams Unexecuted instantiation: configurator.c:quicly_num_streams Unexecuted instantiation: context.c:quicly_num_streams Unexecuted instantiation: headers.c:quicly_num_streams Unexecuted instantiation: request.c:quicly_num_streams Unexecuted instantiation: util.c:quicly_num_streams Unexecuted instantiation: access_log.c:quicly_num_streams Unexecuted instantiation: file.c:quicly_num_streams Unexecuted instantiation: mimemap.c:quicly_num_streams Unexecuted instantiation: proxy.c:quicly_num_streams Unexecuted instantiation: http1.c:quicly_num_streams Unexecuted instantiation: connection.c:quicly_num_streams Unexecuted instantiation: scheduler.c:quicly_num_streams Unexecuted instantiation: stream.c:quicly_num_streams Unexecuted instantiation: http2_debug_state.c:quicly_num_streams Unexecuted instantiation: common.c:quicly_num_streams Unexecuted instantiation: server.c:quicly_num_streams Unexecuted instantiation: cc-reno.c:quicly_num_streams Unexecuted instantiation: defaults.c:quicly_num_streams Unexecuted instantiation: quicly.c:quicly_num_streams Unexecuted instantiation: streambuf.c:quicly_num_streams Unexecuted instantiation: http3client.c:quicly_num_streams Unexecuted instantiation: httpclient.c:quicly_num_streams Unexecuted instantiation: absprio.c:quicly_num_streams Unexecuted instantiation: logconf.c:quicly_num_streams Unexecuted instantiation: compress.c:quicly_num_streams Unexecuted instantiation: gzip.c:quicly_num_streams Unexecuted instantiation: headers_util.c:quicly_num_streams Unexecuted instantiation: frame.c:quicly_num_streams Unexecuted instantiation: qpack.c:quicly_num_streams Unexecuted instantiation: cc-cubic.c:quicly_num_streams Unexecuted instantiation: cc-pico.c:quicly_num_streams Unexecuted instantiation: http1client.c:quicly_num_streams Unexecuted instantiation: http2client.c:quicly_num_streams Unexecuted instantiation: pipe_sender.c:quicly_num_streams Unexecuted instantiation: driver_url.cc:quicly_num_streams(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_num_streams(st_quicly_conn_t*) quicly_mock.c:quicly_num_streams Line | Count | Source | 1646 | 8.92k | { | 1647 | 8.92k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1648 | 8.92k | return c->local.bidi.num_streams + c->local.uni.num_streams + c->remote.bidi.num_streams + c->remote.uni.num_streams; | 1649 | 8.92k | } |
Unexecuted instantiation: errordoc.c:quicly_num_streams Unexecuted instantiation: expires.c:quicly_num_streams Unexecuted instantiation: fastcgi.c:quicly_num_streams Unexecuted instantiation: h2olog.c:quicly_num_streams Unexecuted instantiation: connect.c:quicly_num_streams Unexecuted instantiation: redirect.c:quicly_num_streams Unexecuted instantiation: reproxy.c:quicly_num_streams Unexecuted instantiation: throttle_resp.c:quicly_num_streams Unexecuted instantiation: self_trace.c:quicly_num_streams Unexecuted instantiation: server_timing.c:quicly_num_streams Unexecuted instantiation: status.c:quicly_num_streams Unexecuted instantiation: events.c:quicly_num_streams Unexecuted instantiation: memory.c:quicly_num_streams Unexecuted instantiation: requests.c:quicly_num_streams Unexecuted instantiation: ssl.c:quicly_num_streams Unexecuted instantiation: durations.c:quicly_num_streams Unexecuted instantiation: brotli.c:quicly_num_streams |
1650 | | |
1651 | | inline quicly_context_t *quicly_get_context(quicly_conn_t *conn) |
1652 | 8.76k | { |
1653 | 8.76k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1654 | 8.76k | return c->ctx; |
1655 | 8.76k | } Unexecuted instantiation: driver.cc:quicly_get_context(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_context(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_context Unexecuted instantiation: config.c:quicly_get_context Unexecuted instantiation: configurator.c:quicly_get_context Unexecuted instantiation: context.c:quicly_get_context Unexecuted instantiation: headers.c:quicly_get_context Unexecuted instantiation: request.c:quicly_get_context Unexecuted instantiation: util.c:quicly_get_context Unexecuted instantiation: access_log.c:quicly_get_context Unexecuted instantiation: file.c:quicly_get_context Unexecuted instantiation: mimemap.c:quicly_get_context Unexecuted instantiation: proxy.c:quicly_get_context Unexecuted instantiation: http1.c:quicly_get_context Unexecuted instantiation: connection.c:quicly_get_context Unexecuted instantiation: scheduler.c:quicly_get_context Unexecuted instantiation: stream.c:quicly_get_context Unexecuted instantiation: http2_debug_state.c:quicly_get_context common.c:quicly_get_context Line | Count | Source | 1652 | 6.64k | { | 1653 | 6.64k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1654 | 6.64k | return c->ctx; | 1655 | 6.64k | } |
server.c:quicly_get_context Line | Count | Source | 1652 | 2.11k | { | 1653 | 2.11k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1654 | 2.11k | return c->ctx; | 1655 | 2.11k | } |
Unexecuted instantiation: cc-reno.c:quicly_get_context Unexecuted instantiation: defaults.c:quicly_get_context Unexecuted instantiation: quicly.c:quicly_get_context Unexecuted instantiation: streambuf.c:quicly_get_context Unexecuted instantiation: http3client.c:quicly_get_context Unexecuted instantiation: httpclient.c:quicly_get_context Unexecuted instantiation: absprio.c:quicly_get_context Unexecuted instantiation: logconf.c:quicly_get_context Unexecuted instantiation: compress.c:quicly_get_context Unexecuted instantiation: gzip.c:quicly_get_context Unexecuted instantiation: headers_util.c:quicly_get_context Unexecuted instantiation: frame.c:quicly_get_context Unexecuted instantiation: qpack.c:quicly_get_context Unexecuted instantiation: cc-cubic.c:quicly_get_context Unexecuted instantiation: cc-pico.c:quicly_get_context Unexecuted instantiation: http1client.c:quicly_get_context Unexecuted instantiation: http2client.c:quicly_get_context Unexecuted instantiation: pipe_sender.c:quicly_get_context Unexecuted instantiation: driver_url.cc:quicly_get_context(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_context(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_context Unexecuted instantiation: errordoc.c:quicly_get_context Unexecuted instantiation: expires.c:quicly_get_context Unexecuted instantiation: fastcgi.c:quicly_get_context Unexecuted instantiation: h2olog.c:quicly_get_context Unexecuted instantiation: connect.c:quicly_get_context Unexecuted instantiation: redirect.c:quicly_get_context Unexecuted instantiation: reproxy.c:quicly_get_context Unexecuted instantiation: throttle_resp.c:quicly_get_context Unexecuted instantiation: self_trace.c:quicly_get_context Unexecuted instantiation: server_timing.c:quicly_get_context Unexecuted instantiation: status.c:quicly_get_context Unexecuted instantiation: events.c:quicly_get_context Unexecuted instantiation: memory.c:quicly_get_context Unexecuted instantiation: requests.c:quicly_get_context Unexecuted instantiation: ssl.c:quicly_get_context Unexecuted instantiation: durations.c:quicly_get_context Unexecuted instantiation: brotli.c:quicly_get_context |
1656 | | |
1657 | | inline const quicly_cid_plaintext_t *quicly_get_master_id(quicly_conn_t *conn) |
1658 | 13.2k | { |
1659 | 13.2k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1660 | 13.2k | return &c->local.cid_set.plaintext; |
1661 | 13.2k | } Unexecuted instantiation: driver.cc:quicly_get_master_id(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_master_id(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_master_id Unexecuted instantiation: config.c:quicly_get_master_id Unexecuted instantiation: configurator.c:quicly_get_master_id Unexecuted instantiation: context.c:quicly_get_master_id Unexecuted instantiation: headers.c:quicly_get_master_id Unexecuted instantiation: request.c:quicly_get_master_id Unexecuted instantiation: util.c:quicly_get_master_id Unexecuted instantiation: access_log.c:quicly_get_master_id Unexecuted instantiation: file.c:quicly_get_master_id Unexecuted instantiation: mimemap.c:quicly_get_master_id Unexecuted instantiation: proxy.c:quicly_get_master_id Unexecuted instantiation: http1.c:quicly_get_master_id Unexecuted instantiation: connection.c:quicly_get_master_id Unexecuted instantiation: scheduler.c:quicly_get_master_id Unexecuted instantiation: stream.c:quicly_get_master_id Unexecuted instantiation: http2_debug_state.c:quicly_get_master_id common.c:quicly_get_master_id Line | Count | Source | 1658 | 13.2k | { | 1659 | 13.2k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1660 | 13.2k | return &c->local.cid_set.plaintext; | 1661 | 13.2k | } |
Unexecuted instantiation: server.c:quicly_get_master_id Unexecuted instantiation: cc-reno.c:quicly_get_master_id Unexecuted instantiation: defaults.c:quicly_get_master_id Unexecuted instantiation: quicly.c:quicly_get_master_id Unexecuted instantiation: streambuf.c:quicly_get_master_id Unexecuted instantiation: http3client.c:quicly_get_master_id Unexecuted instantiation: httpclient.c:quicly_get_master_id Unexecuted instantiation: absprio.c:quicly_get_master_id Unexecuted instantiation: logconf.c:quicly_get_master_id Unexecuted instantiation: compress.c:quicly_get_master_id Unexecuted instantiation: gzip.c:quicly_get_master_id Unexecuted instantiation: headers_util.c:quicly_get_master_id Unexecuted instantiation: frame.c:quicly_get_master_id Unexecuted instantiation: qpack.c:quicly_get_master_id Unexecuted instantiation: cc-cubic.c:quicly_get_master_id Unexecuted instantiation: cc-pico.c:quicly_get_master_id Unexecuted instantiation: http1client.c:quicly_get_master_id Unexecuted instantiation: http2client.c:quicly_get_master_id Unexecuted instantiation: pipe_sender.c:quicly_get_master_id Unexecuted instantiation: driver_url.cc:quicly_get_master_id(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_master_id(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_master_id Unexecuted instantiation: errordoc.c:quicly_get_master_id Unexecuted instantiation: expires.c:quicly_get_master_id Unexecuted instantiation: fastcgi.c:quicly_get_master_id Unexecuted instantiation: h2olog.c:quicly_get_master_id Unexecuted instantiation: connect.c:quicly_get_master_id Unexecuted instantiation: redirect.c:quicly_get_master_id Unexecuted instantiation: reproxy.c:quicly_get_master_id Unexecuted instantiation: throttle_resp.c:quicly_get_master_id Unexecuted instantiation: self_trace.c:quicly_get_master_id Unexecuted instantiation: server_timing.c:quicly_get_master_id Unexecuted instantiation: status.c:quicly_get_master_id Unexecuted instantiation: events.c:quicly_get_master_id Unexecuted instantiation: memory.c:quicly_get_master_id Unexecuted instantiation: requests.c:quicly_get_master_id Unexecuted instantiation: ssl.c:quicly_get_master_id Unexecuted instantiation: durations.c:quicly_get_master_id Unexecuted instantiation: brotli.c:quicly_get_master_id |
1662 | | |
1663 | | inline const quicly_cid_t *quicly_get_original_dcid(quicly_conn_t *conn) |
1664 | 0 | { |
1665 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1666 | 0 | return &c->original_dcid; |
1667 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_original_dcid(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_original_dcid(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_original_dcid Unexecuted instantiation: config.c:quicly_get_original_dcid Unexecuted instantiation: configurator.c:quicly_get_original_dcid Unexecuted instantiation: context.c:quicly_get_original_dcid Unexecuted instantiation: headers.c:quicly_get_original_dcid Unexecuted instantiation: request.c:quicly_get_original_dcid Unexecuted instantiation: util.c:quicly_get_original_dcid Unexecuted instantiation: access_log.c:quicly_get_original_dcid Unexecuted instantiation: file.c:quicly_get_original_dcid Unexecuted instantiation: mimemap.c:quicly_get_original_dcid Unexecuted instantiation: proxy.c:quicly_get_original_dcid Unexecuted instantiation: http1.c:quicly_get_original_dcid Unexecuted instantiation: connection.c:quicly_get_original_dcid Unexecuted instantiation: scheduler.c:quicly_get_original_dcid Unexecuted instantiation: stream.c:quicly_get_original_dcid Unexecuted instantiation: http2_debug_state.c:quicly_get_original_dcid Unexecuted instantiation: common.c:quicly_get_original_dcid Unexecuted instantiation: server.c:quicly_get_original_dcid Unexecuted instantiation: cc-reno.c:quicly_get_original_dcid Unexecuted instantiation: defaults.c:quicly_get_original_dcid Unexecuted instantiation: quicly.c:quicly_get_original_dcid Unexecuted instantiation: streambuf.c:quicly_get_original_dcid Unexecuted instantiation: http3client.c:quicly_get_original_dcid Unexecuted instantiation: httpclient.c:quicly_get_original_dcid Unexecuted instantiation: absprio.c:quicly_get_original_dcid Unexecuted instantiation: logconf.c:quicly_get_original_dcid Unexecuted instantiation: compress.c:quicly_get_original_dcid Unexecuted instantiation: gzip.c:quicly_get_original_dcid Unexecuted instantiation: headers_util.c:quicly_get_original_dcid Unexecuted instantiation: frame.c:quicly_get_original_dcid Unexecuted instantiation: qpack.c:quicly_get_original_dcid Unexecuted instantiation: cc-cubic.c:quicly_get_original_dcid Unexecuted instantiation: cc-pico.c:quicly_get_original_dcid Unexecuted instantiation: http1client.c:quicly_get_original_dcid Unexecuted instantiation: http2client.c:quicly_get_original_dcid Unexecuted instantiation: pipe_sender.c:quicly_get_original_dcid Unexecuted instantiation: driver_url.cc:quicly_get_original_dcid(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_original_dcid(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_original_dcid Unexecuted instantiation: errordoc.c:quicly_get_original_dcid Unexecuted instantiation: expires.c:quicly_get_original_dcid Unexecuted instantiation: fastcgi.c:quicly_get_original_dcid Unexecuted instantiation: h2olog.c:quicly_get_original_dcid Unexecuted instantiation: connect.c:quicly_get_original_dcid Unexecuted instantiation: redirect.c:quicly_get_original_dcid Unexecuted instantiation: reproxy.c:quicly_get_original_dcid Unexecuted instantiation: throttle_resp.c:quicly_get_original_dcid Unexecuted instantiation: self_trace.c:quicly_get_original_dcid Unexecuted instantiation: server_timing.c:quicly_get_original_dcid Unexecuted instantiation: status.c:quicly_get_original_dcid Unexecuted instantiation: events.c:quicly_get_original_dcid Unexecuted instantiation: memory.c:quicly_get_original_dcid Unexecuted instantiation: requests.c:quicly_get_original_dcid Unexecuted instantiation: ssl.c:quicly_get_original_dcid Unexecuted instantiation: durations.c:quicly_get_original_dcid Unexecuted instantiation: brotli.c:quicly_get_original_dcid |
1668 | | |
1669 | | inline const quicly_cid_t *quicly_get_remote_cid(quicly_conn_t *conn) |
1670 | 0 | { |
1671 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1672 | 0 | return &c->remote.cid_set.cids[0].cid; |
1673 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_remote_cid(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_remote_cid(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_remote_cid Unexecuted instantiation: config.c:quicly_get_remote_cid Unexecuted instantiation: configurator.c:quicly_get_remote_cid Unexecuted instantiation: context.c:quicly_get_remote_cid Unexecuted instantiation: headers.c:quicly_get_remote_cid Unexecuted instantiation: request.c:quicly_get_remote_cid Unexecuted instantiation: util.c:quicly_get_remote_cid Unexecuted instantiation: access_log.c:quicly_get_remote_cid Unexecuted instantiation: file.c:quicly_get_remote_cid Unexecuted instantiation: mimemap.c:quicly_get_remote_cid Unexecuted instantiation: proxy.c:quicly_get_remote_cid Unexecuted instantiation: http1.c:quicly_get_remote_cid Unexecuted instantiation: connection.c:quicly_get_remote_cid Unexecuted instantiation: scheduler.c:quicly_get_remote_cid Unexecuted instantiation: stream.c:quicly_get_remote_cid Unexecuted instantiation: http2_debug_state.c:quicly_get_remote_cid Unexecuted instantiation: common.c:quicly_get_remote_cid Unexecuted instantiation: server.c:quicly_get_remote_cid Unexecuted instantiation: cc-reno.c:quicly_get_remote_cid Unexecuted instantiation: defaults.c:quicly_get_remote_cid Unexecuted instantiation: quicly.c:quicly_get_remote_cid Unexecuted instantiation: streambuf.c:quicly_get_remote_cid Unexecuted instantiation: http3client.c:quicly_get_remote_cid Unexecuted instantiation: httpclient.c:quicly_get_remote_cid Unexecuted instantiation: absprio.c:quicly_get_remote_cid Unexecuted instantiation: logconf.c:quicly_get_remote_cid Unexecuted instantiation: compress.c:quicly_get_remote_cid Unexecuted instantiation: gzip.c:quicly_get_remote_cid Unexecuted instantiation: headers_util.c:quicly_get_remote_cid Unexecuted instantiation: frame.c:quicly_get_remote_cid Unexecuted instantiation: qpack.c:quicly_get_remote_cid Unexecuted instantiation: cc-cubic.c:quicly_get_remote_cid Unexecuted instantiation: cc-pico.c:quicly_get_remote_cid Unexecuted instantiation: http1client.c:quicly_get_remote_cid Unexecuted instantiation: http2client.c:quicly_get_remote_cid Unexecuted instantiation: pipe_sender.c:quicly_get_remote_cid Unexecuted instantiation: driver_url.cc:quicly_get_remote_cid(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_remote_cid(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_remote_cid Unexecuted instantiation: errordoc.c:quicly_get_remote_cid Unexecuted instantiation: expires.c:quicly_get_remote_cid Unexecuted instantiation: fastcgi.c:quicly_get_remote_cid Unexecuted instantiation: h2olog.c:quicly_get_remote_cid Unexecuted instantiation: connect.c:quicly_get_remote_cid Unexecuted instantiation: redirect.c:quicly_get_remote_cid Unexecuted instantiation: reproxy.c:quicly_get_remote_cid Unexecuted instantiation: throttle_resp.c:quicly_get_remote_cid Unexecuted instantiation: self_trace.c:quicly_get_remote_cid Unexecuted instantiation: server_timing.c:quicly_get_remote_cid Unexecuted instantiation: status.c:quicly_get_remote_cid Unexecuted instantiation: events.c:quicly_get_remote_cid Unexecuted instantiation: memory.c:quicly_get_remote_cid Unexecuted instantiation: requests.c:quicly_get_remote_cid Unexecuted instantiation: ssl.c:quicly_get_remote_cid Unexecuted instantiation: durations.c:quicly_get_remote_cid Unexecuted instantiation: brotli.c:quicly_get_remote_cid |
1674 | | |
1675 | | inline const quicly_transport_parameters_t *quicly_get_remote_transport_parameters(quicly_conn_t *conn) |
1676 | 0 | { |
1677 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1678 | 0 | return &c->remote.transport_params; |
1679 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_remote_transport_parameters(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_remote_transport_parameters(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_remote_transport_parameters Unexecuted instantiation: config.c:quicly_get_remote_transport_parameters Unexecuted instantiation: configurator.c:quicly_get_remote_transport_parameters Unexecuted instantiation: context.c:quicly_get_remote_transport_parameters Unexecuted instantiation: headers.c:quicly_get_remote_transport_parameters Unexecuted instantiation: request.c:quicly_get_remote_transport_parameters Unexecuted instantiation: util.c:quicly_get_remote_transport_parameters Unexecuted instantiation: access_log.c:quicly_get_remote_transport_parameters Unexecuted instantiation: file.c:quicly_get_remote_transport_parameters Unexecuted instantiation: mimemap.c:quicly_get_remote_transport_parameters Unexecuted instantiation: proxy.c:quicly_get_remote_transport_parameters Unexecuted instantiation: http1.c:quicly_get_remote_transport_parameters Unexecuted instantiation: connection.c:quicly_get_remote_transport_parameters Unexecuted instantiation: scheduler.c:quicly_get_remote_transport_parameters Unexecuted instantiation: stream.c:quicly_get_remote_transport_parameters Unexecuted instantiation: http2_debug_state.c:quicly_get_remote_transport_parameters Unexecuted instantiation: common.c:quicly_get_remote_transport_parameters Unexecuted instantiation: server.c:quicly_get_remote_transport_parameters Unexecuted instantiation: cc-reno.c:quicly_get_remote_transport_parameters Unexecuted instantiation: defaults.c:quicly_get_remote_transport_parameters Unexecuted instantiation: quicly.c:quicly_get_remote_transport_parameters Unexecuted instantiation: streambuf.c:quicly_get_remote_transport_parameters Unexecuted instantiation: http3client.c:quicly_get_remote_transport_parameters Unexecuted instantiation: httpclient.c:quicly_get_remote_transport_parameters Unexecuted instantiation: absprio.c:quicly_get_remote_transport_parameters Unexecuted instantiation: logconf.c:quicly_get_remote_transport_parameters Unexecuted instantiation: compress.c:quicly_get_remote_transport_parameters Unexecuted instantiation: gzip.c:quicly_get_remote_transport_parameters Unexecuted instantiation: headers_util.c:quicly_get_remote_transport_parameters Unexecuted instantiation: frame.c:quicly_get_remote_transport_parameters Unexecuted instantiation: qpack.c:quicly_get_remote_transport_parameters Unexecuted instantiation: cc-cubic.c:quicly_get_remote_transport_parameters Unexecuted instantiation: cc-pico.c:quicly_get_remote_transport_parameters Unexecuted instantiation: http1client.c:quicly_get_remote_transport_parameters Unexecuted instantiation: http2client.c:quicly_get_remote_transport_parameters Unexecuted instantiation: pipe_sender.c:quicly_get_remote_transport_parameters Unexecuted instantiation: driver_url.cc:quicly_get_remote_transport_parameters(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_remote_transport_parameters(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_remote_transport_parameters Unexecuted instantiation: errordoc.c:quicly_get_remote_transport_parameters Unexecuted instantiation: expires.c:quicly_get_remote_transport_parameters Unexecuted instantiation: fastcgi.c:quicly_get_remote_transport_parameters Unexecuted instantiation: h2olog.c:quicly_get_remote_transport_parameters Unexecuted instantiation: connect.c:quicly_get_remote_transport_parameters Unexecuted instantiation: redirect.c:quicly_get_remote_transport_parameters Unexecuted instantiation: reproxy.c:quicly_get_remote_transport_parameters Unexecuted instantiation: throttle_resp.c:quicly_get_remote_transport_parameters Unexecuted instantiation: self_trace.c:quicly_get_remote_transport_parameters Unexecuted instantiation: server_timing.c:quicly_get_remote_transport_parameters Unexecuted instantiation: status.c:quicly_get_remote_transport_parameters Unexecuted instantiation: events.c:quicly_get_remote_transport_parameters Unexecuted instantiation: memory.c:quicly_get_remote_transport_parameters Unexecuted instantiation: requests.c:quicly_get_remote_transport_parameters Unexecuted instantiation: ssl.c:quicly_get_remote_transport_parameters Unexecuted instantiation: durations.c:quicly_get_remote_transport_parameters Unexecuted instantiation: brotli.c:quicly_get_remote_transport_parameters |
1680 | | |
1681 | | inline int quicly_is_client(quicly_conn_t *conn) |
1682 | 86.4k | { |
1683 | 86.4k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1684 | 86.4k | return (c->local.bidi.next_stream_id & 1) == 0; |
1685 | 86.4k | } Unexecuted instantiation: driver.cc:quicly_is_client(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_is_client(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_is_client Unexecuted instantiation: config.c:quicly_is_client Unexecuted instantiation: configurator.c:quicly_is_client Unexecuted instantiation: context.c:quicly_is_client Unexecuted instantiation: headers.c:quicly_is_client Unexecuted instantiation: request.c:quicly_is_client Unexecuted instantiation: util.c:quicly_is_client Unexecuted instantiation: access_log.c:quicly_is_client Unexecuted instantiation: file.c:quicly_is_client Unexecuted instantiation: mimemap.c:quicly_is_client Unexecuted instantiation: proxy.c:quicly_is_client Unexecuted instantiation: http1.c:quicly_is_client Unexecuted instantiation: connection.c:quicly_is_client Unexecuted instantiation: scheduler.c:quicly_is_client Unexecuted instantiation: stream.c:quicly_is_client Unexecuted instantiation: http2_debug_state.c:quicly_is_client common.c:quicly_is_client Line | Count | Source | 1682 | 19.9k | { | 1683 | 19.9k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1684 | 19.9k | return (c->local.bidi.next_stream_id & 1) == 0; | 1685 | 19.9k | } |
Unexecuted instantiation: server.c:quicly_is_client Unexecuted instantiation: cc-reno.c:quicly_is_client Unexecuted instantiation: defaults.c:quicly_is_client Unexecuted instantiation: quicly.c:quicly_is_client Unexecuted instantiation: streambuf.c:quicly_is_client Unexecuted instantiation: http3client.c:quicly_is_client Unexecuted instantiation: httpclient.c:quicly_is_client Unexecuted instantiation: absprio.c:quicly_is_client Unexecuted instantiation: logconf.c:quicly_is_client Unexecuted instantiation: compress.c:quicly_is_client Unexecuted instantiation: gzip.c:quicly_is_client Unexecuted instantiation: headers_util.c:quicly_is_client Unexecuted instantiation: frame.c:quicly_is_client Unexecuted instantiation: qpack.c:quicly_is_client Unexecuted instantiation: cc-cubic.c:quicly_is_client Unexecuted instantiation: cc-pico.c:quicly_is_client Unexecuted instantiation: http1client.c:quicly_is_client Unexecuted instantiation: http2client.c:quicly_is_client Unexecuted instantiation: pipe_sender.c:quicly_is_client Unexecuted instantiation: driver_url.cc:quicly_is_client(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_is_client(st_quicly_conn_t*) quicly_mock.c:quicly_is_client Line | Count | Source | 1682 | 66.4k | { | 1683 | 66.4k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1684 | 66.4k | return (c->local.bidi.next_stream_id & 1) == 0; | 1685 | 66.4k | } |
Unexecuted instantiation: errordoc.c:quicly_is_client Unexecuted instantiation: expires.c:quicly_is_client Unexecuted instantiation: fastcgi.c:quicly_is_client Unexecuted instantiation: h2olog.c:quicly_is_client Unexecuted instantiation: connect.c:quicly_is_client Unexecuted instantiation: redirect.c:quicly_is_client Unexecuted instantiation: reproxy.c:quicly_is_client Unexecuted instantiation: throttle_resp.c:quicly_is_client Unexecuted instantiation: self_trace.c:quicly_is_client Unexecuted instantiation: server_timing.c:quicly_is_client Unexecuted instantiation: status.c:quicly_is_client Unexecuted instantiation: events.c:quicly_is_client Unexecuted instantiation: memory.c:quicly_is_client Unexecuted instantiation: requests.c:quicly_is_client Unexecuted instantiation: ssl.c:quicly_is_client Unexecuted instantiation: durations.c:quicly_is_client Unexecuted instantiation: brotli.c:quicly_is_client |
1686 | | |
1687 | | inline quicly_stream_id_t quicly_get_local_next_stream_id(quicly_conn_t *conn, int uni) |
1688 | 0 | { |
1689 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1690 | 0 | return uni ? c->local.uni.next_stream_id : c->local.bidi.next_stream_id; |
1691 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_local_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: driver_common.cc:quicly_get_local_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: socket.c:quicly_get_local_next_stream_id Unexecuted instantiation: config.c:quicly_get_local_next_stream_id Unexecuted instantiation: configurator.c:quicly_get_local_next_stream_id Unexecuted instantiation: context.c:quicly_get_local_next_stream_id Unexecuted instantiation: headers.c:quicly_get_local_next_stream_id Unexecuted instantiation: request.c:quicly_get_local_next_stream_id Unexecuted instantiation: util.c:quicly_get_local_next_stream_id Unexecuted instantiation: access_log.c:quicly_get_local_next_stream_id Unexecuted instantiation: file.c:quicly_get_local_next_stream_id Unexecuted instantiation: mimemap.c:quicly_get_local_next_stream_id Unexecuted instantiation: proxy.c:quicly_get_local_next_stream_id Unexecuted instantiation: http1.c:quicly_get_local_next_stream_id Unexecuted instantiation: connection.c:quicly_get_local_next_stream_id Unexecuted instantiation: scheduler.c:quicly_get_local_next_stream_id Unexecuted instantiation: stream.c:quicly_get_local_next_stream_id Unexecuted instantiation: http2_debug_state.c:quicly_get_local_next_stream_id Unexecuted instantiation: common.c:quicly_get_local_next_stream_id Unexecuted instantiation: server.c:quicly_get_local_next_stream_id Unexecuted instantiation: cc-reno.c:quicly_get_local_next_stream_id Unexecuted instantiation: defaults.c:quicly_get_local_next_stream_id Unexecuted instantiation: quicly.c:quicly_get_local_next_stream_id Unexecuted instantiation: streambuf.c:quicly_get_local_next_stream_id Unexecuted instantiation: http3client.c:quicly_get_local_next_stream_id Unexecuted instantiation: httpclient.c:quicly_get_local_next_stream_id Unexecuted instantiation: absprio.c:quicly_get_local_next_stream_id Unexecuted instantiation: logconf.c:quicly_get_local_next_stream_id Unexecuted instantiation: compress.c:quicly_get_local_next_stream_id Unexecuted instantiation: gzip.c:quicly_get_local_next_stream_id Unexecuted instantiation: headers_util.c:quicly_get_local_next_stream_id Unexecuted instantiation: frame.c:quicly_get_local_next_stream_id Unexecuted instantiation: qpack.c:quicly_get_local_next_stream_id Unexecuted instantiation: cc-cubic.c:quicly_get_local_next_stream_id Unexecuted instantiation: cc-pico.c:quicly_get_local_next_stream_id Unexecuted instantiation: http1client.c:quicly_get_local_next_stream_id Unexecuted instantiation: http2client.c:quicly_get_local_next_stream_id Unexecuted instantiation: pipe_sender.c:quicly_get_local_next_stream_id Unexecuted instantiation: driver_url.cc:quicly_get_local_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: driver_h3.cc:quicly_get_local_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: quicly_mock.c:quicly_get_local_next_stream_id Unexecuted instantiation: errordoc.c:quicly_get_local_next_stream_id Unexecuted instantiation: expires.c:quicly_get_local_next_stream_id Unexecuted instantiation: fastcgi.c:quicly_get_local_next_stream_id Unexecuted instantiation: h2olog.c:quicly_get_local_next_stream_id Unexecuted instantiation: connect.c:quicly_get_local_next_stream_id Unexecuted instantiation: redirect.c:quicly_get_local_next_stream_id Unexecuted instantiation: reproxy.c:quicly_get_local_next_stream_id Unexecuted instantiation: throttle_resp.c:quicly_get_local_next_stream_id Unexecuted instantiation: self_trace.c:quicly_get_local_next_stream_id Unexecuted instantiation: server_timing.c:quicly_get_local_next_stream_id Unexecuted instantiation: status.c:quicly_get_local_next_stream_id Unexecuted instantiation: events.c:quicly_get_local_next_stream_id Unexecuted instantiation: memory.c:quicly_get_local_next_stream_id Unexecuted instantiation: requests.c:quicly_get_local_next_stream_id Unexecuted instantiation: ssl.c:quicly_get_local_next_stream_id Unexecuted instantiation: durations.c:quicly_get_local_next_stream_id Unexecuted instantiation: brotli.c:quicly_get_local_next_stream_id |
1692 | | |
1693 | | inline quicly_stream_id_t quicly_get_remote_next_stream_id(quicly_conn_t *conn, int uni) |
1694 | 0 | { |
1695 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1696 | 0 | return uni ? c->remote.uni.next_stream_id : c->remote.bidi.next_stream_id; |
1697 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_remote_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: driver_common.cc:quicly_get_remote_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: socket.c:quicly_get_remote_next_stream_id Unexecuted instantiation: config.c:quicly_get_remote_next_stream_id Unexecuted instantiation: configurator.c:quicly_get_remote_next_stream_id Unexecuted instantiation: context.c:quicly_get_remote_next_stream_id Unexecuted instantiation: headers.c:quicly_get_remote_next_stream_id Unexecuted instantiation: request.c:quicly_get_remote_next_stream_id Unexecuted instantiation: util.c:quicly_get_remote_next_stream_id Unexecuted instantiation: access_log.c:quicly_get_remote_next_stream_id Unexecuted instantiation: file.c:quicly_get_remote_next_stream_id Unexecuted instantiation: mimemap.c:quicly_get_remote_next_stream_id Unexecuted instantiation: proxy.c:quicly_get_remote_next_stream_id Unexecuted instantiation: http1.c:quicly_get_remote_next_stream_id Unexecuted instantiation: connection.c:quicly_get_remote_next_stream_id Unexecuted instantiation: scheduler.c:quicly_get_remote_next_stream_id Unexecuted instantiation: stream.c:quicly_get_remote_next_stream_id Unexecuted instantiation: http2_debug_state.c:quicly_get_remote_next_stream_id Unexecuted instantiation: common.c:quicly_get_remote_next_stream_id Unexecuted instantiation: server.c:quicly_get_remote_next_stream_id Unexecuted instantiation: cc-reno.c:quicly_get_remote_next_stream_id Unexecuted instantiation: defaults.c:quicly_get_remote_next_stream_id Unexecuted instantiation: quicly.c:quicly_get_remote_next_stream_id Unexecuted instantiation: streambuf.c:quicly_get_remote_next_stream_id Unexecuted instantiation: http3client.c:quicly_get_remote_next_stream_id Unexecuted instantiation: httpclient.c:quicly_get_remote_next_stream_id Unexecuted instantiation: absprio.c:quicly_get_remote_next_stream_id Unexecuted instantiation: logconf.c:quicly_get_remote_next_stream_id Unexecuted instantiation: compress.c:quicly_get_remote_next_stream_id Unexecuted instantiation: gzip.c:quicly_get_remote_next_stream_id Unexecuted instantiation: headers_util.c:quicly_get_remote_next_stream_id Unexecuted instantiation: frame.c:quicly_get_remote_next_stream_id Unexecuted instantiation: qpack.c:quicly_get_remote_next_stream_id Unexecuted instantiation: cc-cubic.c:quicly_get_remote_next_stream_id Unexecuted instantiation: cc-pico.c:quicly_get_remote_next_stream_id Unexecuted instantiation: http1client.c:quicly_get_remote_next_stream_id Unexecuted instantiation: http2client.c:quicly_get_remote_next_stream_id Unexecuted instantiation: pipe_sender.c:quicly_get_remote_next_stream_id Unexecuted instantiation: driver_url.cc:quicly_get_remote_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: driver_h3.cc:quicly_get_remote_next_stream_id(st_quicly_conn_t*, int) Unexecuted instantiation: quicly_mock.c:quicly_get_remote_next_stream_id Unexecuted instantiation: errordoc.c:quicly_get_remote_next_stream_id Unexecuted instantiation: expires.c:quicly_get_remote_next_stream_id Unexecuted instantiation: fastcgi.c:quicly_get_remote_next_stream_id Unexecuted instantiation: h2olog.c:quicly_get_remote_next_stream_id Unexecuted instantiation: connect.c:quicly_get_remote_next_stream_id Unexecuted instantiation: redirect.c:quicly_get_remote_next_stream_id Unexecuted instantiation: reproxy.c:quicly_get_remote_next_stream_id Unexecuted instantiation: throttle_resp.c:quicly_get_remote_next_stream_id Unexecuted instantiation: self_trace.c:quicly_get_remote_next_stream_id Unexecuted instantiation: server_timing.c:quicly_get_remote_next_stream_id Unexecuted instantiation: status.c:quicly_get_remote_next_stream_id Unexecuted instantiation: events.c:quicly_get_remote_next_stream_id Unexecuted instantiation: memory.c:quicly_get_remote_next_stream_id Unexecuted instantiation: requests.c:quicly_get_remote_next_stream_id Unexecuted instantiation: ssl.c:quicly_get_remote_next_stream_id Unexecuted instantiation: durations.c:quicly_get_remote_next_stream_id Unexecuted instantiation: brotli.c:quicly_get_remote_next_stream_id |
1698 | | |
1699 | | inline uint32_t quicly_get_protocol_version(quicly_conn_t *conn) |
1700 | 0 | { |
1701 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1702 | 0 | return c->version; |
1703 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_protocol_version(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_protocol_version(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_protocol_version Unexecuted instantiation: config.c:quicly_get_protocol_version Unexecuted instantiation: configurator.c:quicly_get_protocol_version Unexecuted instantiation: context.c:quicly_get_protocol_version Unexecuted instantiation: headers.c:quicly_get_protocol_version Unexecuted instantiation: request.c:quicly_get_protocol_version Unexecuted instantiation: util.c:quicly_get_protocol_version Unexecuted instantiation: access_log.c:quicly_get_protocol_version Unexecuted instantiation: file.c:quicly_get_protocol_version Unexecuted instantiation: mimemap.c:quicly_get_protocol_version Unexecuted instantiation: proxy.c:quicly_get_protocol_version Unexecuted instantiation: http1.c:quicly_get_protocol_version Unexecuted instantiation: connection.c:quicly_get_protocol_version Unexecuted instantiation: scheduler.c:quicly_get_protocol_version Unexecuted instantiation: stream.c:quicly_get_protocol_version Unexecuted instantiation: http2_debug_state.c:quicly_get_protocol_version Unexecuted instantiation: common.c:quicly_get_protocol_version Unexecuted instantiation: server.c:quicly_get_protocol_version Unexecuted instantiation: cc-reno.c:quicly_get_protocol_version Unexecuted instantiation: defaults.c:quicly_get_protocol_version Unexecuted instantiation: quicly.c:quicly_get_protocol_version Unexecuted instantiation: streambuf.c:quicly_get_protocol_version Unexecuted instantiation: http3client.c:quicly_get_protocol_version Unexecuted instantiation: httpclient.c:quicly_get_protocol_version Unexecuted instantiation: absprio.c:quicly_get_protocol_version Unexecuted instantiation: logconf.c:quicly_get_protocol_version Unexecuted instantiation: compress.c:quicly_get_protocol_version Unexecuted instantiation: gzip.c:quicly_get_protocol_version Unexecuted instantiation: headers_util.c:quicly_get_protocol_version Unexecuted instantiation: frame.c:quicly_get_protocol_version Unexecuted instantiation: qpack.c:quicly_get_protocol_version Unexecuted instantiation: cc-cubic.c:quicly_get_protocol_version Unexecuted instantiation: cc-pico.c:quicly_get_protocol_version Unexecuted instantiation: http1client.c:quicly_get_protocol_version Unexecuted instantiation: http2client.c:quicly_get_protocol_version Unexecuted instantiation: pipe_sender.c:quicly_get_protocol_version Unexecuted instantiation: driver_url.cc:quicly_get_protocol_version(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_protocol_version(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_protocol_version Unexecuted instantiation: errordoc.c:quicly_get_protocol_version Unexecuted instantiation: expires.c:quicly_get_protocol_version Unexecuted instantiation: fastcgi.c:quicly_get_protocol_version Unexecuted instantiation: h2olog.c:quicly_get_protocol_version Unexecuted instantiation: connect.c:quicly_get_protocol_version Unexecuted instantiation: redirect.c:quicly_get_protocol_version Unexecuted instantiation: reproxy.c:quicly_get_protocol_version Unexecuted instantiation: throttle_resp.c:quicly_get_protocol_version Unexecuted instantiation: self_trace.c:quicly_get_protocol_version Unexecuted instantiation: server_timing.c:quicly_get_protocol_version Unexecuted instantiation: status.c:quicly_get_protocol_version Unexecuted instantiation: events.c:quicly_get_protocol_version Unexecuted instantiation: memory.c:quicly_get_protocol_version Unexecuted instantiation: requests.c:quicly_get_protocol_version Unexecuted instantiation: ssl.c:quicly_get_protocol_version Unexecuted instantiation: durations.c:quicly_get_protocol_version Unexecuted instantiation: brotli.c:quicly_get_protocol_version |
1704 | | |
1705 | | inline void **quicly_get_data(quicly_conn_t *conn) |
1706 | 54.3k | { |
1707 | 54.3k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1708 | 54.3k | return &c->data; |
1709 | 54.3k | } Unexecuted instantiation: driver.cc:quicly_get_data(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_data(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_data Unexecuted instantiation: config.c:quicly_get_data Unexecuted instantiation: configurator.c:quicly_get_data Unexecuted instantiation: context.c:quicly_get_data Unexecuted instantiation: headers.c:quicly_get_data Unexecuted instantiation: request.c:quicly_get_data Unexecuted instantiation: util.c:quicly_get_data Unexecuted instantiation: access_log.c:quicly_get_data Unexecuted instantiation: file.c:quicly_get_data Unexecuted instantiation: mimemap.c:quicly_get_data Unexecuted instantiation: proxy.c:quicly_get_data Unexecuted instantiation: http1.c:quicly_get_data Unexecuted instantiation: connection.c:quicly_get_data Unexecuted instantiation: scheduler.c:quicly_get_data Unexecuted instantiation: stream.c:quicly_get_data Unexecuted instantiation: http2_debug_state.c:quicly_get_data Line | Count | Source | 1706 | 6.64k | { | 1707 | 6.64k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1708 | 6.64k | return &c->data; | 1709 | 6.64k | } |
Line | Count | Source | 1706 | 47.7k | { | 1707 | 47.7k | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; | 1708 | 47.7k | return &c->data; | 1709 | 47.7k | } |
Unexecuted instantiation: cc-reno.c:quicly_get_data Unexecuted instantiation: defaults.c:quicly_get_data Unexecuted instantiation: quicly.c:quicly_get_data Unexecuted instantiation: streambuf.c:quicly_get_data Unexecuted instantiation: http3client.c:quicly_get_data Unexecuted instantiation: httpclient.c:quicly_get_data Unexecuted instantiation: absprio.c:quicly_get_data Unexecuted instantiation: logconf.c:quicly_get_data Unexecuted instantiation: compress.c:quicly_get_data Unexecuted instantiation: gzip.c:quicly_get_data Unexecuted instantiation: headers_util.c:quicly_get_data Unexecuted instantiation: frame.c:quicly_get_data Unexecuted instantiation: qpack.c:quicly_get_data Unexecuted instantiation: cc-cubic.c:quicly_get_data Unexecuted instantiation: cc-pico.c:quicly_get_data Unexecuted instantiation: http1client.c:quicly_get_data Unexecuted instantiation: http2client.c:quicly_get_data Unexecuted instantiation: pipe_sender.c:quicly_get_data Unexecuted instantiation: driver_url.cc:quicly_get_data(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_data(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_data Unexecuted instantiation: errordoc.c:quicly_get_data Unexecuted instantiation: expires.c:quicly_get_data Unexecuted instantiation: fastcgi.c:quicly_get_data Unexecuted instantiation: h2olog.c:quicly_get_data Unexecuted instantiation: connect.c:quicly_get_data Unexecuted instantiation: redirect.c:quicly_get_data Unexecuted instantiation: reproxy.c:quicly_get_data Unexecuted instantiation: throttle_resp.c:quicly_get_data Unexecuted instantiation: self_trace.c:quicly_get_data Unexecuted instantiation: server_timing.c:quicly_get_data Unexecuted instantiation: status.c:quicly_get_data Unexecuted instantiation: events.c:quicly_get_data Unexecuted instantiation: memory.c:quicly_get_data Unexecuted instantiation: requests.c:quicly_get_data Unexecuted instantiation: ssl.c:quicly_get_data Unexecuted instantiation: durations.c:quicly_get_data Unexecuted instantiation: brotli.c:quicly_get_data |
1710 | | |
1711 | | inline quicly_tracer_t *quicly_get_tracer(quicly_conn_t *conn) |
1712 | 0 | { |
1713 | 0 | struct _st_quicly_conn_public_t *c = (struct _st_quicly_conn_public_t *)conn; |
1714 | 0 | return &c->tracer; |
1715 | 0 | } Unexecuted instantiation: driver.cc:quicly_get_tracer(st_quicly_conn_t*) Unexecuted instantiation: driver_common.cc:quicly_get_tracer(st_quicly_conn_t*) Unexecuted instantiation: socket.c:quicly_get_tracer Unexecuted instantiation: config.c:quicly_get_tracer Unexecuted instantiation: configurator.c:quicly_get_tracer Unexecuted instantiation: context.c:quicly_get_tracer Unexecuted instantiation: headers.c:quicly_get_tracer Unexecuted instantiation: request.c:quicly_get_tracer Unexecuted instantiation: util.c:quicly_get_tracer Unexecuted instantiation: access_log.c:quicly_get_tracer Unexecuted instantiation: file.c:quicly_get_tracer Unexecuted instantiation: mimemap.c:quicly_get_tracer Unexecuted instantiation: proxy.c:quicly_get_tracer Unexecuted instantiation: http1.c:quicly_get_tracer Unexecuted instantiation: connection.c:quicly_get_tracer Unexecuted instantiation: scheduler.c:quicly_get_tracer Unexecuted instantiation: stream.c:quicly_get_tracer Unexecuted instantiation: http2_debug_state.c:quicly_get_tracer Unexecuted instantiation: common.c:quicly_get_tracer Unexecuted instantiation: server.c:quicly_get_tracer Unexecuted instantiation: cc-reno.c:quicly_get_tracer Unexecuted instantiation: defaults.c:quicly_get_tracer Unexecuted instantiation: quicly.c:quicly_get_tracer Unexecuted instantiation: streambuf.c:quicly_get_tracer Unexecuted instantiation: http3client.c:quicly_get_tracer Unexecuted instantiation: httpclient.c:quicly_get_tracer Unexecuted instantiation: absprio.c:quicly_get_tracer Unexecuted instantiation: logconf.c:quicly_get_tracer Unexecuted instantiation: compress.c:quicly_get_tracer Unexecuted instantiation: gzip.c:quicly_get_tracer Unexecuted instantiation: headers_util.c:quicly_get_tracer Unexecuted instantiation: frame.c:quicly_get_tracer Unexecuted instantiation: qpack.c:quicly_get_tracer Unexecuted instantiation: cc-cubic.c:quicly_get_tracer Unexecuted instantiation: cc-pico.c:quicly_get_tracer Unexecuted instantiation: http1client.c:quicly_get_tracer Unexecuted instantiation: http2client.c:quicly_get_tracer Unexecuted instantiation: pipe_sender.c:quicly_get_tracer Unexecuted instantiation: driver_url.cc:quicly_get_tracer(st_quicly_conn_t*) Unexecuted instantiation: driver_h3.cc:quicly_get_tracer(st_quicly_conn_t*) Unexecuted instantiation: quicly_mock.c:quicly_get_tracer Unexecuted instantiation: errordoc.c:quicly_get_tracer Unexecuted instantiation: expires.c:quicly_get_tracer Unexecuted instantiation: fastcgi.c:quicly_get_tracer Unexecuted instantiation: h2olog.c:quicly_get_tracer Unexecuted instantiation: connect.c:quicly_get_tracer Unexecuted instantiation: redirect.c:quicly_get_tracer Unexecuted instantiation: reproxy.c:quicly_get_tracer Unexecuted instantiation: throttle_resp.c:quicly_get_tracer Unexecuted instantiation: self_trace.c:quicly_get_tracer Unexecuted instantiation: server_timing.c:quicly_get_tracer Unexecuted instantiation: status.c:quicly_get_tracer Unexecuted instantiation: events.c:quicly_get_tracer Unexecuted instantiation: memory.c:quicly_get_tracer Unexecuted instantiation: requests.c:quicly_get_tracer Unexecuted instantiation: ssl.c:quicly_get_tracer Unexecuted instantiation: durations.c:quicly_get_tracer Unexecuted instantiation: brotli.c:quicly_get_tracer |
1716 | | |
1717 | | inline int quicly_stop_requested(quicly_stream_t *stream) |
1718 | 33.9k | { |
1719 | 33.9k | return stream->_send_aux.stop_sending.sender_state != QUICLY_SENDER_STATE_NONE; |
1720 | 33.9k | } Unexecuted instantiation: driver.cc:quicly_stop_requested(st_quicly_stream_t*) Unexecuted instantiation: driver_common.cc:quicly_stop_requested(st_quicly_stream_t*) Unexecuted instantiation: socket.c:quicly_stop_requested Unexecuted instantiation: config.c:quicly_stop_requested Unexecuted instantiation: configurator.c:quicly_stop_requested Unexecuted instantiation: context.c:quicly_stop_requested Unexecuted instantiation: headers.c:quicly_stop_requested Unexecuted instantiation: request.c:quicly_stop_requested Unexecuted instantiation: util.c:quicly_stop_requested Unexecuted instantiation: access_log.c:quicly_stop_requested Unexecuted instantiation: file.c:quicly_stop_requested Unexecuted instantiation: mimemap.c:quicly_stop_requested Unexecuted instantiation: proxy.c:quicly_stop_requested Unexecuted instantiation: http1.c:quicly_stop_requested Unexecuted instantiation: connection.c:quicly_stop_requested Unexecuted instantiation: scheduler.c:quicly_stop_requested Unexecuted instantiation: stream.c:quicly_stop_requested Unexecuted instantiation: http2_debug_state.c:quicly_stop_requested Unexecuted instantiation: common.c:quicly_stop_requested server.c:quicly_stop_requested Line | Count | Source | 1718 | 33.9k | { | 1719 | 33.9k | return stream->_send_aux.stop_sending.sender_state != QUICLY_SENDER_STATE_NONE; | 1720 | 33.9k | } |
Unexecuted instantiation: cc-reno.c:quicly_stop_requested Unexecuted instantiation: defaults.c:quicly_stop_requested Unexecuted instantiation: quicly.c:quicly_stop_requested Unexecuted instantiation: streambuf.c:quicly_stop_requested Unexecuted instantiation: http3client.c:quicly_stop_requested Unexecuted instantiation: httpclient.c:quicly_stop_requested Unexecuted instantiation: absprio.c:quicly_stop_requested Unexecuted instantiation: logconf.c:quicly_stop_requested Unexecuted instantiation: compress.c:quicly_stop_requested Unexecuted instantiation: gzip.c:quicly_stop_requested Unexecuted instantiation: headers_util.c:quicly_stop_requested Unexecuted instantiation: frame.c:quicly_stop_requested Unexecuted instantiation: qpack.c:quicly_stop_requested Unexecuted instantiation: cc-cubic.c:quicly_stop_requested Unexecuted instantiation: cc-pico.c:quicly_stop_requested Unexecuted instantiation: http1client.c:quicly_stop_requested Unexecuted instantiation: http2client.c:quicly_stop_requested Unexecuted instantiation: pipe_sender.c:quicly_stop_requested Unexecuted instantiation: driver_url.cc:quicly_stop_requested(st_quicly_stream_t*) Unexecuted instantiation: driver_h3.cc:quicly_stop_requested(st_quicly_stream_t*) Unexecuted instantiation: quicly_mock.c:quicly_stop_requested Unexecuted instantiation: errordoc.c:quicly_stop_requested Unexecuted instantiation: expires.c:quicly_stop_requested Unexecuted instantiation: fastcgi.c:quicly_stop_requested Unexecuted instantiation: h2olog.c:quicly_stop_requested Unexecuted instantiation: connect.c:quicly_stop_requested Unexecuted instantiation: redirect.c:quicly_stop_requested Unexecuted instantiation: reproxy.c:quicly_stop_requested Unexecuted instantiation: throttle_resp.c:quicly_stop_requested Unexecuted instantiation: self_trace.c:quicly_stop_requested Unexecuted instantiation: server_timing.c:quicly_stop_requested Unexecuted instantiation: status.c:quicly_stop_requested Unexecuted instantiation: events.c:quicly_stop_requested Unexecuted instantiation: memory.c:quicly_stop_requested Unexecuted instantiation: requests.c:quicly_stop_requested Unexecuted instantiation: ssl.c:quicly_stop_requested Unexecuted instantiation: durations.c:quicly_stop_requested Unexecuted instantiation: brotli.c:quicly_stop_requested |
1721 | | |
1722 | | inline uint32_t quicly_stream_get_receive_window(quicly_stream_t *stream) |
1723 | 0 | { |
1724 | 0 | return stream->_recv_aux.window; |
1725 | 0 | } Unexecuted instantiation: driver.cc:quicly_stream_get_receive_window(st_quicly_stream_t*) Unexecuted instantiation: driver_common.cc:quicly_stream_get_receive_window(st_quicly_stream_t*) Unexecuted instantiation: socket.c:quicly_stream_get_receive_window Unexecuted instantiation: config.c:quicly_stream_get_receive_window Unexecuted instantiation: configurator.c:quicly_stream_get_receive_window Unexecuted instantiation: context.c:quicly_stream_get_receive_window Unexecuted instantiation: headers.c:quicly_stream_get_receive_window Unexecuted instantiation: request.c:quicly_stream_get_receive_window Unexecuted instantiation: util.c:quicly_stream_get_receive_window Unexecuted instantiation: access_log.c:quicly_stream_get_receive_window Unexecuted instantiation: file.c:quicly_stream_get_receive_window Unexecuted instantiation: mimemap.c:quicly_stream_get_receive_window Unexecuted instantiation: proxy.c:quicly_stream_get_receive_window Unexecuted instantiation: http1.c:quicly_stream_get_receive_window Unexecuted instantiation: connection.c:quicly_stream_get_receive_window Unexecuted instantiation: scheduler.c:quicly_stream_get_receive_window Unexecuted instantiation: stream.c:quicly_stream_get_receive_window Unexecuted instantiation: http2_debug_state.c:quicly_stream_get_receive_window Unexecuted instantiation: common.c:quicly_stream_get_receive_window Unexecuted instantiation: server.c:quicly_stream_get_receive_window Unexecuted instantiation: cc-reno.c:quicly_stream_get_receive_window Unexecuted instantiation: defaults.c:quicly_stream_get_receive_window Unexecuted instantiation: quicly.c:quicly_stream_get_receive_window Unexecuted instantiation: streambuf.c:quicly_stream_get_receive_window Unexecuted instantiation: http3client.c:quicly_stream_get_receive_window Unexecuted instantiation: httpclient.c:quicly_stream_get_receive_window Unexecuted instantiation: absprio.c:quicly_stream_get_receive_window Unexecuted instantiation: logconf.c:quicly_stream_get_receive_window Unexecuted instantiation: compress.c:quicly_stream_get_receive_window Unexecuted instantiation: gzip.c:quicly_stream_get_receive_window Unexecuted instantiation: headers_util.c:quicly_stream_get_receive_window Unexecuted instantiation: frame.c:quicly_stream_get_receive_window Unexecuted instantiation: qpack.c:quicly_stream_get_receive_window Unexecuted instantiation: cc-cubic.c:quicly_stream_get_receive_window Unexecuted instantiation: cc-pico.c:quicly_stream_get_receive_window Unexecuted instantiation: http1client.c:quicly_stream_get_receive_window Unexecuted instantiation: http2client.c:quicly_stream_get_receive_window Unexecuted instantiation: pipe_sender.c:quicly_stream_get_receive_window Unexecuted instantiation: driver_url.cc:quicly_stream_get_receive_window(st_quicly_stream_t*) Unexecuted instantiation: driver_h3.cc:quicly_stream_get_receive_window(st_quicly_stream_t*) Unexecuted instantiation: quicly_mock.c:quicly_stream_get_receive_window Unexecuted instantiation: errordoc.c:quicly_stream_get_receive_window Unexecuted instantiation: expires.c:quicly_stream_get_receive_window Unexecuted instantiation: fastcgi.c:quicly_stream_get_receive_window Unexecuted instantiation: h2olog.c:quicly_stream_get_receive_window Unexecuted instantiation: connect.c:quicly_stream_get_receive_window Unexecuted instantiation: redirect.c:quicly_stream_get_receive_window Unexecuted instantiation: reproxy.c:quicly_stream_get_receive_window Unexecuted instantiation: throttle_resp.c:quicly_stream_get_receive_window Unexecuted instantiation: self_trace.c:quicly_stream_get_receive_window Unexecuted instantiation: server_timing.c:quicly_stream_get_receive_window Unexecuted instantiation: status.c:quicly_stream_get_receive_window Unexecuted instantiation: events.c:quicly_stream_get_receive_window Unexecuted instantiation: memory.c:quicly_stream_get_receive_window Unexecuted instantiation: requests.c:quicly_stream_get_receive_window Unexecuted instantiation: ssl.c:quicly_stream_get_receive_window Unexecuted instantiation: durations.c:quicly_stream_get_receive_window Unexecuted instantiation: brotli.c:quicly_stream_get_receive_window |
1726 | | |
1727 | | inline void quicly_stream_set_receive_window(quicly_stream_t *stream, uint32_t window) |
1728 | 225 | { |
1729 | 225 | stream->_recv_aux.window = window; |
1730 | 225 | } Unexecuted instantiation: driver.cc:quicly_stream_set_receive_window(st_quicly_stream_t*, unsigned int) Unexecuted instantiation: driver_common.cc:quicly_stream_set_receive_window(st_quicly_stream_t*, unsigned int) Unexecuted instantiation: socket.c:quicly_stream_set_receive_window Unexecuted instantiation: config.c:quicly_stream_set_receive_window Unexecuted instantiation: configurator.c:quicly_stream_set_receive_window Unexecuted instantiation: context.c:quicly_stream_set_receive_window Unexecuted instantiation: headers.c:quicly_stream_set_receive_window Unexecuted instantiation: request.c:quicly_stream_set_receive_window Unexecuted instantiation: util.c:quicly_stream_set_receive_window Unexecuted instantiation: access_log.c:quicly_stream_set_receive_window Unexecuted instantiation: file.c:quicly_stream_set_receive_window Unexecuted instantiation: mimemap.c:quicly_stream_set_receive_window Unexecuted instantiation: proxy.c:quicly_stream_set_receive_window Unexecuted instantiation: http1.c:quicly_stream_set_receive_window Unexecuted instantiation: connection.c:quicly_stream_set_receive_window Unexecuted instantiation: scheduler.c:quicly_stream_set_receive_window Unexecuted instantiation: stream.c:quicly_stream_set_receive_window Unexecuted instantiation: http2_debug_state.c:quicly_stream_set_receive_window Unexecuted instantiation: common.c:quicly_stream_set_receive_window server.c:quicly_stream_set_receive_window Line | Count | Source | 1728 | 225 | { | 1729 | 225 | stream->_recv_aux.window = window; | 1730 | 225 | } |
Unexecuted instantiation: cc-reno.c:quicly_stream_set_receive_window Unexecuted instantiation: defaults.c:quicly_stream_set_receive_window Unexecuted instantiation: quicly.c:quicly_stream_set_receive_window Unexecuted instantiation: streambuf.c:quicly_stream_set_receive_window Unexecuted instantiation: http3client.c:quicly_stream_set_receive_window Unexecuted instantiation: httpclient.c:quicly_stream_set_receive_window Unexecuted instantiation: absprio.c:quicly_stream_set_receive_window Unexecuted instantiation: logconf.c:quicly_stream_set_receive_window Unexecuted instantiation: compress.c:quicly_stream_set_receive_window Unexecuted instantiation: gzip.c:quicly_stream_set_receive_window Unexecuted instantiation: headers_util.c:quicly_stream_set_receive_window Unexecuted instantiation: frame.c:quicly_stream_set_receive_window Unexecuted instantiation: qpack.c:quicly_stream_set_receive_window Unexecuted instantiation: cc-cubic.c:quicly_stream_set_receive_window Unexecuted instantiation: cc-pico.c:quicly_stream_set_receive_window Unexecuted instantiation: http1client.c:quicly_stream_set_receive_window Unexecuted instantiation: http2client.c:quicly_stream_set_receive_window Unexecuted instantiation: pipe_sender.c:quicly_stream_set_receive_window Unexecuted instantiation: driver_url.cc:quicly_stream_set_receive_window(st_quicly_stream_t*, unsigned int) Unexecuted instantiation: driver_h3.cc:quicly_stream_set_receive_window(st_quicly_stream_t*, unsigned int) Unexecuted instantiation: quicly_mock.c:quicly_stream_set_receive_window Unexecuted instantiation: errordoc.c:quicly_stream_set_receive_window Unexecuted instantiation: expires.c:quicly_stream_set_receive_window Unexecuted instantiation: fastcgi.c:quicly_stream_set_receive_window Unexecuted instantiation: h2olog.c:quicly_stream_set_receive_window Unexecuted instantiation: connect.c:quicly_stream_set_receive_window Unexecuted instantiation: redirect.c:quicly_stream_set_receive_window Unexecuted instantiation: reproxy.c:quicly_stream_set_receive_window Unexecuted instantiation: throttle_resp.c:quicly_stream_set_receive_window Unexecuted instantiation: self_trace.c:quicly_stream_set_receive_window Unexecuted instantiation: server_timing.c:quicly_stream_set_receive_window Unexecuted instantiation: status.c:quicly_stream_set_receive_window Unexecuted instantiation: events.c:quicly_stream_set_receive_window Unexecuted instantiation: memory.c:quicly_stream_set_receive_window Unexecuted instantiation: requests.c:quicly_stream_set_receive_window Unexecuted instantiation: ssl.c:quicly_stream_set_receive_window Unexecuted instantiation: durations.c:quicly_stream_set_receive_window Unexecuted instantiation: brotli.c:quicly_stream_set_receive_window |
1731 | | |
1732 | | inline int quicly_stream_is_client_initiated(quicly_stream_id_t stream_id) |
1733 | 99.7k | { |
1734 | 99.7k | if (stream_id < 0) |
1735 | 0 | return (stream_id & 1) != 0; |
1736 | 99.7k | return (stream_id & 1) == 0; |
1737 | 99.7k | } Unexecuted instantiation: driver.cc:quicly_stream_is_client_initiated(long) Unexecuted instantiation: driver_common.cc:quicly_stream_is_client_initiated(long) Unexecuted instantiation: socket.c:quicly_stream_is_client_initiated Unexecuted instantiation: config.c:quicly_stream_is_client_initiated Unexecuted instantiation: configurator.c:quicly_stream_is_client_initiated Unexecuted instantiation: context.c:quicly_stream_is_client_initiated Unexecuted instantiation: headers.c:quicly_stream_is_client_initiated Unexecuted instantiation: request.c:quicly_stream_is_client_initiated Unexecuted instantiation: util.c:quicly_stream_is_client_initiated Unexecuted instantiation: access_log.c:quicly_stream_is_client_initiated Unexecuted instantiation: file.c:quicly_stream_is_client_initiated Unexecuted instantiation: mimemap.c:quicly_stream_is_client_initiated Unexecuted instantiation: proxy.c:quicly_stream_is_client_initiated Unexecuted instantiation: http1.c:quicly_stream_is_client_initiated Unexecuted instantiation: connection.c:quicly_stream_is_client_initiated Unexecuted instantiation: scheduler.c:quicly_stream_is_client_initiated Unexecuted instantiation: stream.c:quicly_stream_is_client_initiated Unexecuted instantiation: http2_debug_state.c:quicly_stream_is_client_initiated common.c:quicly_stream_is_client_initiated Line | Count | Source | 1733 | 19.9k | { | 1734 | 19.9k | if (stream_id < 0) | 1735 | 0 | return (stream_id & 1) != 0; | 1736 | 19.9k | return (stream_id & 1) == 0; | 1737 | 19.9k | } |
server.c:quicly_stream_is_client_initiated Line | Count | Source | 1733 | 6.64k | { | 1734 | 6.64k | if (stream_id < 0) | 1735 | 0 | return (stream_id & 1) != 0; | 1736 | 6.64k | return (stream_id & 1) == 0; | 1737 | 6.64k | } |
Unexecuted instantiation: cc-reno.c:quicly_stream_is_client_initiated Unexecuted instantiation: defaults.c:quicly_stream_is_client_initiated Unexecuted instantiation: quicly.c:quicly_stream_is_client_initiated Unexecuted instantiation: streambuf.c:quicly_stream_is_client_initiated Unexecuted instantiation: http3client.c:quicly_stream_is_client_initiated Unexecuted instantiation: httpclient.c:quicly_stream_is_client_initiated Unexecuted instantiation: absprio.c:quicly_stream_is_client_initiated Unexecuted instantiation: logconf.c:quicly_stream_is_client_initiated Unexecuted instantiation: compress.c:quicly_stream_is_client_initiated Unexecuted instantiation: gzip.c:quicly_stream_is_client_initiated Unexecuted instantiation: headers_util.c:quicly_stream_is_client_initiated Unexecuted instantiation: frame.c:quicly_stream_is_client_initiated Unexecuted instantiation: qpack.c:quicly_stream_is_client_initiated Unexecuted instantiation: cc-cubic.c:quicly_stream_is_client_initiated Unexecuted instantiation: cc-pico.c:quicly_stream_is_client_initiated Unexecuted instantiation: http1client.c:quicly_stream_is_client_initiated Unexecuted instantiation: http2client.c:quicly_stream_is_client_initiated Unexecuted instantiation: pipe_sender.c:quicly_stream_is_client_initiated Unexecuted instantiation: driver_url.cc:quicly_stream_is_client_initiated(long) Unexecuted instantiation: driver_h3.cc:quicly_stream_is_client_initiated(long) quicly_mock.c:quicly_stream_is_client_initiated Line | Count | Source | 1733 | 73.1k | { | 1734 | 73.1k | if (stream_id < 0) | 1735 | 0 | return (stream_id & 1) != 0; | 1736 | 73.1k | return (stream_id & 1) == 0; | 1737 | 73.1k | } |
Unexecuted instantiation: errordoc.c:quicly_stream_is_client_initiated Unexecuted instantiation: expires.c:quicly_stream_is_client_initiated Unexecuted instantiation: fastcgi.c:quicly_stream_is_client_initiated Unexecuted instantiation: h2olog.c:quicly_stream_is_client_initiated Unexecuted instantiation: connect.c:quicly_stream_is_client_initiated Unexecuted instantiation: redirect.c:quicly_stream_is_client_initiated Unexecuted instantiation: reproxy.c:quicly_stream_is_client_initiated Unexecuted instantiation: throttle_resp.c:quicly_stream_is_client_initiated Unexecuted instantiation: self_trace.c:quicly_stream_is_client_initiated Unexecuted instantiation: server_timing.c:quicly_stream_is_client_initiated Unexecuted instantiation: status.c:quicly_stream_is_client_initiated Unexecuted instantiation: events.c:quicly_stream_is_client_initiated Unexecuted instantiation: memory.c:quicly_stream_is_client_initiated Unexecuted instantiation: requests.c:quicly_stream_is_client_initiated Unexecuted instantiation: ssl.c:quicly_stream_is_client_initiated Unexecuted instantiation: durations.c:quicly_stream_is_client_initiated Unexecuted instantiation: brotli.c:quicly_stream_is_client_initiated |
1738 | | |
1739 | | inline int quicly_stream_is_unidirectional(quicly_stream_id_t stream_id) |
1740 | 138k | { |
1741 | 138k | if (stream_id < 0) |
1742 | 0 | return 0; |
1743 | 138k | return (stream_id & 2) != 0; |
1744 | 138k | } Unexecuted instantiation: driver.cc:quicly_stream_is_unidirectional(long) Unexecuted instantiation: driver_common.cc:quicly_stream_is_unidirectional(long) Unexecuted instantiation: socket.c:quicly_stream_is_unidirectional Unexecuted instantiation: config.c:quicly_stream_is_unidirectional Unexecuted instantiation: configurator.c:quicly_stream_is_unidirectional Unexecuted instantiation: context.c:quicly_stream_is_unidirectional Unexecuted instantiation: headers.c:quicly_stream_is_unidirectional Unexecuted instantiation: request.c:quicly_stream_is_unidirectional Unexecuted instantiation: util.c:quicly_stream_is_unidirectional Unexecuted instantiation: access_log.c:quicly_stream_is_unidirectional Unexecuted instantiation: file.c:quicly_stream_is_unidirectional Unexecuted instantiation: mimemap.c:quicly_stream_is_unidirectional Unexecuted instantiation: proxy.c:quicly_stream_is_unidirectional Unexecuted instantiation: http1.c:quicly_stream_is_unidirectional Unexecuted instantiation: connection.c:quicly_stream_is_unidirectional Unexecuted instantiation: scheduler.c:quicly_stream_is_unidirectional Unexecuted instantiation: stream.c:quicly_stream_is_unidirectional Unexecuted instantiation: http2_debug_state.c:quicly_stream_is_unidirectional Unexecuted instantiation: common.c:quicly_stream_is_unidirectional server.c:quicly_stream_is_unidirectional Line | Count | Source | 1740 | 52.4k | { | 1741 | 52.4k | if (stream_id < 0) | 1742 | 0 | return 0; | 1743 | 52.4k | return (stream_id & 2) != 0; | 1744 | 52.4k | } |
Unexecuted instantiation: cc-reno.c:quicly_stream_is_unidirectional Unexecuted instantiation: defaults.c:quicly_stream_is_unidirectional Unexecuted instantiation: quicly.c:quicly_stream_is_unidirectional Unexecuted instantiation: streambuf.c:quicly_stream_is_unidirectional Unexecuted instantiation: http3client.c:quicly_stream_is_unidirectional Unexecuted instantiation: httpclient.c:quicly_stream_is_unidirectional Unexecuted instantiation: absprio.c:quicly_stream_is_unidirectional Unexecuted instantiation: logconf.c:quicly_stream_is_unidirectional Unexecuted instantiation: compress.c:quicly_stream_is_unidirectional Unexecuted instantiation: gzip.c:quicly_stream_is_unidirectional Unexecuted instantiation: headers_util.c:quicly_stream_is_unidirectional Unexecuted instantiation: frame.c:quicly_stream_is_unidirectional Unexecuted instantiation: qpack.c:quicly_stream_is_unidirectional Unexecuted instantiation: cc-cubic.c:quicly_stream_is_unidirectional Unexecuted instantiation: cc-pico.c:quicly_stream_is_unidirectional Unexecuted instantiation: http1client.c:quicly_stream_is_unidirectional Unexecuted instantiation: http2client.c:quicly_stream_is_unidirectional Unexecuted instantiation: pipe_sender.c:quicly_stream_is_unidirectional Unexecuted instantiation: driver_url.cc:quicly_stream_is_unidirectional(long) Unexecuted instantiation: driver_h3.cc:quicly_stream_is_unidirectional(long) quicly_mock.c:quicly_stream_is_unidirectional Line | Count | Source | 1740 | 86.4k | { | 1741 | 86.4k | if (stream_id < 0) | 1742 | 0 | return 0; | 1743 | 86.4k | return (stream_id & 2) != 0; | 1744 | 86.4k | } |
Unexecuted instantiation: errordoc.c:quicly_stream_is_unidirectional Unexecuted instantiation: expires.c:quicly_stream_is_unidirectional Unexecuted instantiation: fastcgi.c:quicly_stream_is_unidirectional Unexecuted instantiation: h2olog.c:quicly_stream_is_unidirectional Unexecuted instantiation: connect.c:quicly_stream_is_unidirectional Unexecuted instantiation: redirect.c:quicly_stream_is_unidirectional Unexecuted instantiation: reproxy.c:quicly_stream_is_unidirectional Unexecuted instantiation: throttle_resp.c:quicly_stream_is_unidirectional Unexecuted instantiation: self_trace.c:quicly_stream_is_unidirectional Unexecuted instantiation: server_timing.c:quicly_stream_is_unidirectional Unexecuted instantiation: status.c:quicly_stream_is_unidirectional Unexecuted instantiation: events.c:quicly_stream_is_unidirectional Unexecuted instantiation: memory.c:quicly_stream_is_unidirectional Unexecuted instantiation: requests.c:quicly_stream_is_unidirectional Unexecuted instantiation: ssl.c:quicly_stream_is_unidirectional Unexecuted instantiation: durations.c:quicly_stream_is_unidirectional Unexecuted instantiation: brotli.c:quicly_stream_is_unidirectional |
1745 | | |
1746 | | inline int quicly_stream_has_send_side(int is_client, quicly_stream_id_t stream_id) |
1747 | 27.6k | { |
1748 | 27.6k | if (!quicly_stream_is_unidirectional(stream_id)) |
1749 | 7.65k | return 1; |
1750 | 19.9k | return is_client == quicly_stream_is_client_initiated(stream_id); |
1751 | 27.6k | } Unexecuted instantiation: driver.cc:quicly_stream_has_send_side(int, long) Unexecuted instantiation: driver_common.cc:quicly_stream_has_send_side(int, long) Unexecuted instantiation: socket.c:quicly_stream_has_send_side Unexecuted instantiation: config.c:quicly_stream_has_send_side Unexecuted instantiation: configurator.c:quicly_stream_has_send_side Unexecuted instantiation: context.c:quicly_stream_has_send_side Unexecuted instantiation: headers.c:quicly_stream_has_send_side Unexecuted instantiation: request.c:quicly_stream_has_send_side Unexecuted instantiation: util.c:quicly_stream_has_send_side Unexecuted instantiation: access_log.c:quicly_stream_has_send_side Unexecuted instantiation: file.c:quicly_stream_has_send_side Unexecuted instantiation: mimemap.c:quicly_stream_has_send_side Unexecuted instantiation: proxy.c:quicly_stream_has_send_side Unexecuted instantiation: http1.c:quicly_stream_has_send_side Unexecuted instantiation: connection.c:quicly_stream_has_send_side Unexecuted instantiation: scheduler.c:quicly_stream_has_send_side Unexecuted instantiation: stream.c:quicly_stream_has_send_side Unexecuted instantiation: http2_debug_state.c:quicly_stream_has_send_side Unexecuted instantiation: common.c:quicly_stream_has_send_side server.c:quicly_stream_has_send_side Line | Count | Source | 1747 | 1.01k | { | 1748 | 1.01k | if (!quicly_stream_is_unidirectional(stream_id)) | 1749 | 1.01k | return 1; | 1750 | 0 | return is_client == quicly_stream_is_client_initiated(stream_id); | 1751 | 1.01k | } |
Unexecuted instantiation: cc-reno.c:quicly_stream_has_send_side Unexecuted instantiation: defaults.c:quicly_stream_has_send_side Unexecuted instantiation: quicly.c:quicly_stream_has_send_side Unexecuted instantiation: streambuf.c:quicly_stream_has_send_side Unexecuted instantiation: http3client.c:quicly_stream_has_send_side Unexecuted instantiation: httpclient.c:quicly_stream_has_send_side Unexecuted instantiation: absprio.c:quicly_stream_has_send_side Unexecuted instantiation: logconf.c:quicly_stream_has_send_side Unexecuted instantiation: compress.c:quicly_stream_has_send_side Unexecuted instantiation: gzip.c:quicly_stream_has_send_side Unexecuted instantiation: headers_util.c:quicly_stream_has_send_side Unexecuted instantiation: frame.c:quicly_stream_has_send_side Unexecuted instantiation: qpack.c:quicly_stream_has_send_side Unexecuted instantiation: cc-cubic.c:quicly_stream_has_send_side Unexecuted instantiation: cc-pico.c:quicly_stream_has_send_side Unexecuted instantiation: http1client.c:quicly_stream_has_send_side Unexecuted instantiation: http2client.c:quicly_stream_has_send_side Unexecuted instantiation: pipe_sender.c:quicly_stream_has_send_side Unexecuted instantiation: driver_url.cc:quicly_stream_has_send_side(int, long) Unexecuted instantiation: driver_h3.cc:quicly_stream_has_send_side(int, long) quicly_mock.c:quicly_stream_has_send_side Line | Count | Source | 1747 | 26.5k | { | 1748 | 26.5k | if (!quicly_stream_is_unidirectional(stream_id)) | 1749 | 6.64k | return 1; | 1750 | 19.9k | return is_client == quicly_stream_is_client_initiated(stream_id); | 1751 | 26.5k | } |
Unexecuted instantiation: errordoc.c:quicly_stream_has_send_side Unexecuted instantiation: expires.c:quicly_stream_has_send_side Unexecuted instantiation: fastcgi.c:quicly_stream_has_send_side Unexecuted instantiation: h2olog.c:quicly_stream_has_send_side Unexecuted instantiation: connect.c:quicly_stream_has_send_side Unexecuted instantiation: redirect.c:quicly_stream_has_send_side Unexecuted instantiation: reproxy.c:quicly_stream_has_send_side Unexecuted instantiation: throttle_resp.c:quicly_stream_has_send_side Unexecuted instantiation: self_trace.c:quicly_stream_has_send_side Unexecuted instantiation: server_timing.c:quicly_stream_has_send_side Unexecuted instantiation: status.c:quicly_stream_has_send_side Unexecuted instantiation: events.c:quicly_stream_has_send_side Unexecuted instantiation: memory.c:quicly_stream_has_send_side Unexecuted instantiation: requests.c:quicly_stream_has_send_side Unexecuted instantiation: ssl.c:quicly_stream_has_send_side Unexecuted instantiation: durations.c:quicly_stream_has_send_side Unexecuted instantiation: brotli.c:quicly_stream_has_send_side |
1752 | | |
1753 | | inline int quicly_stream_has_receive_side(int is_client, quicly_stream_id_t stream_id) |
1754 | 28.5k | { |
1755 | 28.5k | if (!quicly_stream_is_unidirectional(stream_id)) |
1756 | 8.57k | return 1; |
1757 | 19.9k | return is_client != quicly_stream_is_client_initiated(stream_id); |
1758 | 28.5k | } Unexecuted instantiation: driver.cc:quicly_stream_has_receive_side(int, long) Unexecuted instantiation: driver_common.cc:quicly_stream_has_receive_side(int, long) Unexecuted instantiation: socket.c:quicly_stream_has_receive_side Unexecuted instantiation: config.c:quicly_stream_has_receive_side Unexecuted instantiation: configurator.c:quicly_stream_has_receive_side Unexecuted instantiation: context.c:quicly_stream_has_receive_side Unexecuted instantiation: headers.c:quicly_stream_has_receive_side Unexecuted instantiation: request.c:quicly_stream_has_receive_side Unexecuted instantiation: util.c:quicly_stream_has_receive_side Unexecuted instantiation: access_log.c:quicly_stream_has_receive_side Unexecuted instantiation: file.c:quicly_stream_has_receive_side Unexecuted instantiation: mimemap.c:quicly_stream_has_receive_side Unexecuted instantiation: proxy.c:quicly_stream_has_receive_side Unexecuted instantiation: http1.c:quicly_stream_has_receive_side Unexecuted instantiation: connection.c:quicly_stream_has_receive_side Unexecuted instantiation: scheduler.c:quicly_stream_has_receive_side Unexecuted instantiation: stream.c:quicly_stream_has_receive_side Unexecuted instantiation: http2_debug_state.c:quicly_stream_has_receive_side Unexecuted instantiation: common.c:quicly_stream_has_receive_side server.c:quicly_stream_has_receive_side Line | Count | Source | 1754 | 1.92k | { | 1755 | 1.92k | if (!quicly_stream_is_unidirectional(stream_id)) | 1756 | 1.92k | return 1; | 1757 | 0 | return is_client != quicly_stream_is_client_initiated(stream_id); | 1758 | 1.92k | } |
Unexecuted instantiation: cc-reno.c:quicly_stream_has_receive_side Unexecuted instantiation: defaults.c:quicly_stream_has_receive_side Unexecuted instantiation: quicly.c:quicly_stream_has_receive_side Unexecuted instantiation: streambuf.c:quicly_stream_has_receive_side Unexecuted instantiation: http3client.c:quicly_stream_has_receive_side Unexecuted instantiation: httpclient.c:quicly_stream_has_receive_side Unexecuted instantiation: absprio.c:quicly_stream_has_receive_side Unexecuted instantiation: logconf.c:quicly_stream_has_receive_side Unexecuted instantiation: compress.c:quicly_stream_has_receive_side Unexecuted instantiation: gzip.c:quicly_stream_has_receive_side Unexecuted instantiation: headers_util.c:quicly_stream_has_receive_side Unexecuted instantiation: frame.c:quicly_stream_has_receive_side Unexecuted instantiation: qpack.c:quicly_stream_has_receive_side Unexecuted instantiation: cc-cubic.c:quicly_stream_has_receive_side Unexecuted instantiation: cc-pico.c:quicly_stream_has_receive_side Unexecuted instantiation: http1client.c:quicly_stream_has_receive_side Unexecuted instantiation: http2client.c:quicly_stream_has_receive_side Unexecuted instantiation: pipe_sender.c:quicly_stream_has_receive_side Unexecuted instantiation: driver_url.cc:quicly_stream_has_receive_side(int, long) Unexecuted instantiation: driver_h3.cc:quicly_stream_has_receive_side(int, long) quicly_mock.c:quicly_stream_has_receive_side Line | Count | Source | 1754 | 26.5k | { | 1755 | 26.5k | if (!quicly_stream_is_unidirectional(stream_id)) | 1756 | 6.64k | return 1; | 1757 | 19.9k | return is_client != quicly_stream_is_client_initiated(stream_id); | 1758 | 26.5k | } |
Unexecuted instantiation: errordoc.c:quicly_stream_has_receive_side Unexecuted instantiation: expires.c:quicly_stream_has_receive_side Unexecuted instantiation: fastcgi.c:quicly_stream_has_receive_side Unexecuted instantiation: h2olog.c:quicly_stream_has_receive_side Unexecuted instantiation: connect.c:quicly_stream_has_receive_side Unexecuted instantiation: redirect.c:quicly_stream_has_receive_side Unexecuted instantiation: reproxy.c:quicly_stream_has_receive_side Unexecuted instantiation: throttle_resp.c:quicly_stream_has_receive_side Unexecuted instantiation: self_trace.c:quicly_stream_has_receive_side Unexecuted instantiation: server_timing.c:quicly_stream_has_receive_side Unexecuted instantiation: status.c:quicly_stream_has_receive_side Unexecuted instantiation: events.c:quicly_stream_has_receive_side Unexecuted instantiation: memory.c:quicly_stream_has_receive_side Unexecuted instantiation: requests.c:quicly_stream_has_receive_side Unexecuted instantiation: ssl.c:quicly_stream_has_receive_side Unexecuted instantiation: durations.c:quicly_stream_has_receive_side Unexecuted instantiation: brotli.c:quicly_stream_has_receive_side |
1759 | | |
1760 | | inline int quicly_stream_is_self_initiated(quicly_stream_t *stream) |
1761 | 19.9k | { |
1762 | 19.9k | return quicly_stream_is_client_initiated(stream->stream_id) == quicly_is_client(stream->conn); |
1763 | 19.9k | } Unexecuted instantiation: driver.cc:quicly_stream_is_self_initiated(st_quicly_stream_t*) Unexecuted instantiation: driver_common.cc:quicly_stream_is_self_initiated(st_quicly_stream_t*) Unexecuted instantiation: socket.c:quicly_stream_is_self_initiated Unexecuted instantiation: config.c:quicly_stream_is_self_initiated Unexecuted instantiation: configurator.c:quicly_stream_is_self_initiated Unexecuted instantiation: context.c:quicly_stream_is_self_initiated Unexecuted instantiation: headers.c:quicly_stream_is_self_initiated Unexecuted instantiation: request.c:quicly_stream_is_self_initiated Unexecuted instantiation: util.c:quicly_stream_is_self_initiated Unexecuted instantiation: access_log.c:quicly_stream_is_self_initiated Unexecuted instantiation: file.c:quicly_stream_is_self_initiated Unexecuted instantiation: mimemap.c:quicly_stream_is_self_initiated Unexecuted instantiation: proxy.c:quicly_stream_is_self_initiated Unexecuted instantiation: http1.c:quicly_stream_is_self_initiated Unexecuted instantiation: connection.c:quicly_stream_is_self_initiated Unexecuted instantiation: scheduler.c:quicly_stream_is_self_initiated Unexecuted instantiation: stream.c:quicly_stream_is_self_initiated Unexecuted instantiation: http2_debug_state.c:quicly_stream_is_self_initiated common.c:quicly_stream_is_self_initiated Line | Count | Source | 1761 | 19.9k | { | 1762 | 19.9k | return quicly_stream_is_client_initiated(stream->stream_id) == quicly_is_client(stream->conn); | 1763 | 19.9k | } |
Unexecuted instantiation: server.c:quicly_stream_is_self_initiated Unexecuted instantiation: cc-reno.c:quicly_stream_is_self_initiated Unexecuted instantiation: defaults.c:quicly_stream_is_self_initiated Unexecuted instantiation: quicly.c:quicly_stream_is_self_initiated Unexecuted instantiation: streambuf.c:quicly_stream_is_self_initiated Unexecuted instantiation: http3client.c:quicly_stream_is_self_initiated Unexecuted instantiation: httpclient.c:quicly_stream_is_self_initiated Unexecuted instantiation: absprio.c:quicly_stream_is_self_initiated Unexecuted instantiation: logconf.c:quicly_stream_is_self_initiated Unexecuted instantiation: compress.c:quicly_stream_is_self_initiated Unexecuted instantiation: gzip.c:quicly_stream_is_self_initiated Unexecuted instantiation: headers_util.c:quicly_stream_is_self_initiated Unexecuted instantiation: frame.c:quicly_stream_is_self_initiated Unexecuted instantiation: qpack.c:quicly_stream_is_self_initiated Unexecuted instantiation: cc-cubic.c:quicly_stream_is_self_initiated Unexecuted instantiation: cc-pico.c:quicly_stream_is_self_initiated Unexecuted instantiation: http1client.c:quicly_stream_is_self_initiated Unexecuted instantiation: http2client.c:quicly_stream_is_self_initiated Unexecuted instantiation: pipe_sender.c:quicly_stream_is_self_initiated Unexecuted instantiation: driver_url.cc:quicly_stream_is_self_initiated(st_quicly_stream_t*) Unexecuted instantiation: driver_h3.cc:quicly_stream_is_self_initiated(st_quicly_stream_t*) Unexecuted instantiation: quicly_mock.c:quicly_stream_is_self_initiated Unexecuted instantiation: errordoc.c:quicly_stream_is_self_initiated Unexecuted instantiation: expires.c:quicly_stream_is_self_initiated Unexecuted instantiation: fastcgi.c:quicly_stream_is_self_initiated Unexecuted instantiation: h2olog.c:quicly_stream_is_self_initiated Unexecuted instantiation: connect.c:quicly_stream_is_self_initiated Unexecuted instantiation: redirect.c:quicly_stream_is_self_initiated Unexecuted instantiation: reproxy.c:quicly_stream_is_self_initiated Unexecuted instantiation: throttle_resp.c:quicly_stream_is_self_initiated Unexecuted instantiation: self_trace.c:quicly_stream_is_self_initiated Unexecuted instantiation: server_timing.c:quicly_stream_is_self_initiated Unexecuted instantiation: status.c:quicly_stream_is_self_initiated Unexecuted instantiation: events.c:quicly_stream_is_self_initiated Unexecuted instantiation: memory.c:quicly_stream_is_self_initiated Unexecuted instantiation: requests.c:quicly_stream_is_self_initiated Unexecuted instantiation: ssl.c:quicly_stream_is_self_initiated Unexecuted instantiation: durations.c:quicly_stream_is_self_initiated Unexecuted instantiation: brotli.c:quicly_stream_is_self_initiated |
1764 | | |
1765 | | inline void quicly_byte_to_hex(char *dst, uint8_t v) |
1766 | 0 | { |
1767 | 0 | dst[0] = "0123456789abcdef"[v >> 4]; |
1768 | 0 | dst[1] = "0123456789abcdef"[v & 0xf]; |
1769 | 0 | } Unexecuted instantiation: driver.cc:quicly_byte_to_hex(char*, unsigned char) Unexecuted instantiation: driver_common.cc:quicly_byte_to_hex(char*, unsigned char) Unexecuted instantiation: socket.c:quicly_byte_to_hex Unexecuted instantiation: config.c:quicly_byte_to_hex Unexecuted instantiation: configurator.c:quicly_byte_to_hex Unexecuted instantiation: context.c:quicly_byte_to_hex Unexecuted instantiation: headers.c:quicly_byte_to_hex Unexecuted instantiation: request.c:quicly_byte_to_hex Unexecuted instantiation: util.c:quicly_byte_to_hex Unexecuted instantiation: access_log.c:quicly_byte_to_hex Unexecuted instantiation: file.c:quicly_byte_to_hex Unexecuted instantiation: mimemap.c:quicly_byte_to_hex Unexecuted instantiation: proxy.c:quicly_byte_to_hex Unexecuted instantiation: http1.c:quicly_byte_to_hex Unexecuted instantiation: connection.c:quicly_byte_to_hex Unexecuted instantiation: scheduler.c:quicly_byte_to_hex Unexecuted instantiation: stream.c:quicly_byte_to_hex Unexecuted instantiation: http2_debug_state.c:quicly_byte_to_hex Unexecuted instantiation: common.c:quicly_byte_to_hex Unexecuted instantiation: server.c:quicly_byte_to_hex Unexecuted instantiation: cc-reno.c:quicly_byte_to_hex Unexecuted instantiation: defaults.c:quicly_byte_to_hex Unexecuted instantiation: quicly.c:quicly_byte_to_hex Unexecuted instantiation: streambuf.c:quicly_byte_to_hex Unexecuted instantiation: http3client.c:quicly_byte_to_hex Unexecuted instantiation: httpclient.c:quicly_byte_to_hex Unexecuted instantiation: absprio.c:quicly_byte_to_hex Unexecuted instantiation: logconf.c:quicly_byte_to_hex Unexecuted instantiation: compress.c:quicly_byte_to_hex Unexecuted instantiation: gzip.c:quicly_byte_to_hex Unexecuted instantiation: headers_util.c:quicly_byte_to_hex Unexecuted instantiation: frame.c:quicly_byte_to_hex Unexecuted instantiation: qpack.c:quicly_byte_to_hex Unexecuted instantiation: cc-cubic.c:quicly_byte_to_hex Unexecuted instantiation: cc-pico.c:quicly_byte_to_hex Unexecuted instantiation: http1client.c:quicly_byte_to_hex Unexecuted instantiation: http2client.c:quicly_byte_to_hex Unexecuted instantiation: pipe_sender.c:quicly_byte_to_hex Unexecuted instantiation: driver_url.cc:quicly_byte_to_hex(char*, unsigned char) Unexecuted instantiation: driver_h3.cc:quicly_byte_to_hex(char*, unsigned char) Unexecuted instantiation: quicly_mock.c:quicly_byte_to_hex Unexecuted instantiation: errordoc.c:quicly_byte_to_hex Unexecuted instantiation: expires.c:quicly_byte_to_hex Unexecuted instantiation: fastcgi.c:quicly_byte_to_hex Unexecuted instantiation: h2olog.c:quicly_byte_to_hex Unexecuted instantiation: connect.c:quicly_byte_to_hex Unexecuted instantiation: redirect.c:quicly_byte_to_hex Unexecuted instantiation: reproxy.c:quicly_byte_to_hex Unexecuted instantiation: throttle_resp.c:quicly_byte_to_hex Unexecuted instantiation: self_trace.c:quicly_byte_to_hex Unexecuted instantiation: server_timing.c:quicly_byte_to_hex Unexecuted instantiation: status.c:quicly_byte_to_hex Unexecuted instantiation: events.c:quicly_byte_to_hex Unexecuted instantiation: memory.c:quicly_byte_to_hex Unexecuted instantiation: requests.c:quicly_byte_to_hex Unexecuted instantiation: ssl.c:quicly_byte_to_hex Unexecuted instantiation: durations.c:quicly_byte_to_hex Unexecuted instantiation: brotli.c:quicly_byte_to_hex |
1770 | | |
1771 | | #ifdef __cplusplus |
1772 | | } |
1773 | | #endif |
1774 | | |
1775 | | #endif |