Coverage Report

Created: 2026-06-15 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
common.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
}
server.c:quicly_get_data
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