xref: /aosp_15_r20/external/curl/lib/vquic/vquic_int.h (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_VQUIC_QUIC_INT_H
2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_VQUIC_QUIC_INT_H
3*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
4*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
5*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
6*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
7*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
8*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
11*6236dae4SAndroid Build Coastguard Worker  *
12*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
13*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
14*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
15*6236dae4SAndroid Build Coastguard Worker  *
16*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
17*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
18*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
19*6236dae4SAndroid Build Coastguard Worker  *
20*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
24*6236dae4SAndroid Build Coastguard Worker  *
25*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
26*6236dae4SAndroid Build Coastguard Worker 
27*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
28*6236dae4SAndroid Build Coastguard Worker #include "bufq.h"
29*6236dae4SAndroid Build Coastguard Worker 
30*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTP3
31*6236dae4SAndroid Build Coastguard Worker 
32*6236dae4SAndroid Build Coastguard Worker #define MAX_PKT_BURST 10
33*6236dae4SAndroid Build Coastguard Worker #define MAX_UDP_PAYLOAD_SIZE  1452
34*6236dae4SAndroid Build Coastguard Worker /* Default QUIC connection timeout we announce from our side */
35*6236dae4SAndroid Build Coastguard Worker #define CURL_QUIC_MAX_IDLE_MS   (120 * 1000)
36*6236dae4SAndroid Build Coastguard Worker 
37*6236dae4SAndroid Build Coastguard Worker struct cf_quic_ctx {
38*6236dae4SAndroid Build Coastguard Worker   curl_socket_t sockfd; /* connected UDP socket */
39*6236dae4SAndroid Build Coastguard Worker   struct sockaddr_storage local_addr; /* address socket is bound to */
40*6236dae4SAndroid Build Coastguard Worker   socklen_t local_addrlen; /* length of local address */
41*6236dae4SAndroid Build Coastguard Worker 
42*6236dae4SAndroid Build Coastguard Worker   struct bufq sendbuf; /* buffer for sending one or more packets */
43*6236dae4SAndroid Build Coastguard Worker   struct curltime first_byte_at;     /* when first byte was recvd */
44*6236dae4SAndroid Build Coastguard Worker   struct curltime last_op; /* last (attempted) send/recv operation */
45*6236dae4SAndroid Build Coastguard Worker   struct curltime last_io; /* last successful socket IO */
46*6236dae4SAndroid Build Coastguard Worker   size_t gsolen; /* length of individual packets in send buf */
47*6236dae4SAndroid Build Coastguard Worker   size_t split_len; /* if != 0, buffer length after which GSO differs */
48*6236dae4SAndroid Build Coastguard Worker   size_t split_gsolen; /* length of individual packets after split_len */
49*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
50*6236dae4SAndroid Build Coastguard Worker   int wblock_percent; /* percent of writes doing EAGAIN */
51*6236dae4SAndroid Build Coastguard Worker #endif
52*6236dae4SAndroid Build Coastguard Worker   BIT(got_first_byte); /* if first byte was received */
53*6236dae4SAndroid Build Coastguard Worker   BIT(no_gso); /* do not use gso on sending */
54*6236dae4SAndroid Build Coastguard Worker };
55*6236dae4SAndroid Build Coastguard Worker 
56*6236dae4SAndroid Build Coastguard Worker CURLcode vquic_ctx_init(struct cf_quic_ctx *qctx);
57*6236dae4SAndroid Build Coastguard Worker void vquic_ctx_free(struct cf_quic_ctx *qctx);
58*6236dae4SAndroid Build Coastguard Worker 
59*6236dae4SAndroid Build Coastguard Worker void vquic_ctx_update_time(struct cf_quic_ctx *qctx);
60*6236dae4SAndroid Build Coastguard Worker 
61*6236dae4SAndroid Build Coastguard Worker void vquic_push_blocked_pkt(struct Curl_cfilter *cf,
62*6236dae4SAndroid Build Coastguard Worker                             struct cf_quic_ctx *qctx,
63*6236dae4SAndroid Build Coastguard Worker                             const uint8_t *pkt, size_t pktlen, size_t gsolen);
64*6236dae4SAndroid Build Coastguard Worker 
65*6236dae4SAndroid Build Coastguard Worker CURLcode vquic_send_blocked_pkts(struct Curl_cfilter *cf,
66*6236dae4SAndroid Build Coastguard Worker                                  struct Curl_easy *data,
67*6236dae4SAndroid Build Coastguard Worker                                  struct cf_quic_ctx *qctx);
68*6236dae4SAndroid Build Coastguard Worker 
69*6236dae4SAndroid Build Coastguard Worker CURLcode vquic_send(struct Curl_cfilter *cf, struct Curl_easy *data,
70*6236dae4SAndroid Build Coastguard Worker                         struct cf_quic_ctx *qctx, size_t gsolen);
71*6236dae4SAndroid Build Coastguard Worker 
72*6236dae4SAndroid Build Coastguard Worker CURLcode vquic_send_tail_split(struct Curl_cfilter *cf, struct Curl_easy *data,
73*6236dae4SAndroid Build Coastguard Worker                                struct cf_quic_ctx *qctx, size_t gsolen,
74*6236dae4SAndroid Build Coastguard Worker                                size_t tail_len, size_t tail_gsolen);
75*6236dae4SAndroid Build Coastguard Worker 
76*6236dae4SAndroid Build Coastguard Worker CURLcode vquic_flush(struct Curl_cfilter *cf, struct Curl_easy *data,
77*6236dae4SAndroid Build Coastguard Worker                      struct cf_quic_ctx *qctx);
78*6236dae4SAndroid Build Coastguard Worker 
79*6236dae4SAndroid Build Coastguard Worker 
80*6236dae4SAndroid Build Coastguard Worker typedef CURLcode vquic_recv_pkt_cb(const unsigned char *pkt, size_t pktlen,
81*6236dae4SAndroid Build Coastguard Worker                                    struct sockaddr_storage *remote_addr,
82*6236dae4SAndroid Build Coastguard Worker                                    socklen_t remote_addrlen, int ecn,
83*6236dae4SAndroid Build Coastguard Worker                                    void *userp);
84*6236dae4SAndroid Build Coastguard Worker 
85*6236dae4SAndroid Build Coastguard Worker CURLcode vquic_recv_packets(struct Curl_cfilter *cf,
86*6236dae4SAndroid Build Coastguard Worker                             struct Curl_easy *data,
87*6236dae4SAndroid Build Coastguard Worker                             struct cf_quic_ctx *qctx,
88*6236dae4SAndroid Build Coastguard Worker                             size_t max_pkts,
89*6236dae4SAndroid Build Coastguard Worker                             vquic_recv_pkt_cb *recv_cb, void *userp);
90*6236dae4SAndroid Build Coastguard Worker 
91*6236dae4SAndroid Build Coastguard Worker #endif /* !USE_HTTP3 */
92*6236dae4SAndroid Build Coastguard Worker 
93*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_VQUIC_QUIC_INT_H */
94