lsquic.h revision 75a7a2a3
1/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ 2#ifndef __LSQUIC_H__ 3#define __LSQUIC_H__ 4 5/** 6 * @file 7 * public API for using liblsquic is defined in this file. 8 * 9 */ 10 11#include <stdarg.h> 12#include <lsquic_types.h> 13#ifndef WIN32 14#include <sys/uio.h> 15#include <time.h> 16#else 17#include <vc_compat.h> 18#endif 19 20struct sockaddr; 21 22#ifdef __cplusplus 23extern "C" { 24#endif 25 26#define LSQUIC_MAJOR_VERSION 2 27#define LSQUIC_MINOR_VERSION 5 28#define LSQUIC_PATCH_VERSION 2 29 30/** 31 * Engine flags: 32 */ 33 34/** Server mode */ 35#define LSENG_SERVER (1 << 0) 36 37/** Treat stream 3 as headers stream and, in general, behave like the 38 * regular QUIC. 39 */ 40#define LSENG_HTTP (1 << 1) 41 42#define LSENG_HTTP_SERVER (LSENG_SERVER|LSENG_HTTP) 43 44/** 45 * This is a list of QUIC versions that we know of. List of supported 46 * versions is in LSQUIC_SUPPORTED_VERSIONS. 47 */ 48enum lsquic_version 49{ 50 51 /** Q035. This is the first version to be supported by LSQUIC. */ 52 /* Support for this version has been removed. The comment remains to 53 * document the changes. 54 */ 55 56 /* 57 * Q037. This version is like Q035, except the way packet hashes are 58 * generated is different for clients and servers. In addition, new 59 * option NSTP (no STOP_WAITING frames) is rumored to be supported at 60 * some point in the future. 61 */ 62 /* Support for this version has been removed. The comment remains to 63 * document the changes. 64 */ 65 66 /* 67 * Q038. Based on Q037, supports PADDING frames in the middle of packet 68 * and NSTP (no STOP_WAITING frames) option. 69 */ 70 /* Support for this version has been removed. The comment remains to 71 * document the changes. 72 */ 73 74 /** 75 * Q039. Switch to big endian. Do not ack acks. Send connection level 76 * WINDOW_UPDATE frame every 20 sent packets which do not contain 77 * retransmittable frames. 78 */ 79 LSQVER_039, 80 81 /* 82 * Q041. RST_STREAM, ACK and STREAM frames match IETF format. 83 */ 84 /* Support for this version has been removed. The comment remains to 85 * document the changes. 86 */ 87 88 /* 89 * Q042. Receiving overlapping stream data is allowed. 90 */ 91 /* Support for this version has been removed. The comment remains to 92 * document the changes. 93 */ 94 95 /** 96 * Q043. Support for processing PRIORITY frames. Since this library 97 * has supported PRIORITY frames from the beginning, this version is 98 * exactly the same as LSQVER_042. 99 */ 100 LSQVER_043, 101 102 /** 103 * Q044. IETF-like packet headers are used. Frames are the same as 104 * in Q043. Server never includes CIDs in short packets. 105 */ 106 /* Support for this version has been removed. The comment remains to 107 * document the changes. 108 */ 109 110 /** 111 * Q046. Use IETF Draft-17 compatible packet headers. 112 */ 113 LSQVER_046, 114 115#if LSQUIC_USE_Q098 116 /** 117 * Q098. This is a made-up, experimental version used to test version 118 * negotiation. The choice of 98 is similar to Google's choice of 99 119 * as the "IETF" version. 120 */ 121 LSQVER_098, 122#define LSQUIC_EXPERIMENTAL_Q098 (1 << LSQVER_098) 123#else 124#define LSQUIC_EXPERIMENTAL_Q098 0 125#endif 126 127 /** 128 * IETF QUIC Draft-23 129 */ 130 LSQVER_ID23, 131 132 /** 133 * Special version to trigger version negotiation. 134 * [draft-ietf-quic-transport-11], Section 3. 135 */ 136 LSQVER_VERNEG, 137 138 N_LSQVER 139}; 140 141/** 142 * We currently support versions 39, 43, 46, and IETF Draft-23 143 * @see lsquic_version 144 */ 145#define LSQUIC_SUPPORTED_VERSIONS ((1 << N_LSQVER) - 1) 146 147/** 148 * List of versions in which the server never includes CID in short packets. 149 */ 150#define LSQUIC_FORCED_TCID0_VERSIONS (1 << LSQVER_046) 151 152#define LSQUIC_EXPERIMENTAL_VERSIONS ( \ 153 (1 << LSQVER_VERNEG) | LSQUIC_EXPERIMENTAL_Q098) 154 155#define LSQUIC_DEPRECATED_VERSIONS 0 156 157#define LSQUIC_GQUIC_HEADER_VERSIONS ((1 << LSQVER_039) | (1 << LSQVER_043)) 158 159#define LSQUIC_IETF_VERSIONS ((1 << LSQVER_ID23) | (1 << LSQVER_VERNEG)) 160 161#define LSQUIC_IETF_DRAFT_VERSIONS ((1 << LSQVER_ID23) | (1 << LSQVER_VERNEG)) 162 163enum lsquic_hsk_status 164{ 165 /** 166 * The handshake failed. 167 */ 168 LSQ_HSK_FAIL, 169 /** 170 * The handshake succeeded without 0-RTT. 171 */ 172 LSQ_HSK_OK, 173 /** 174 * The handshake succeeded with 0-RTT. 175 */ 176 LSQ_HSK_0RTT_OK, 177 /** 178 * The handshake failed because of 0-RTT (early data rejected). Retry 179 * the connection without 0-RTT. 180 */ 181 LSQ_HSK_0RTT_FAIL, 182}; 183 184/** 185 * @struct lsquic_stream_if 186 * @brief The definition of callback functions call by lsquic_stream to 187 * process events. 188 * 189 */ 190struct lsquic_stream_if { 191 192 /** 193 * Use @ref lsquic_conn_get_ctx to get back the context. It is 194 * OK for this function to return NULL. 195 */ 196 lsquic_conn_ctx_t *(*on_new_conn)(void *stream_if_ctx, 197 lsquic_conn_t *c); 198 199 /** This is called when our side received GOAWAY frame. After this, 200 * new streams should not be created. The callback is optional. 201 */ 202 void (*on_goaway_received)(lsquic_conn_t *c); 203 void (*on_conn_closed)(lsquic_conn_t *c); 204 205 /** If you need to initiate a connection, call lsquic_conn_make_stream(). 206 * This will cause `on_new_stream' callback to be called when appropriate 207 * (this operation is delayed when maximum number of outgoing streams is 208 * reached). 209 * 210 * After `on_close' is called, the stream is no longer accessible. 211 */ 212 lsquic_stream_ctx_t * 213 (*on_new_stream)(void *stream_if_ctx, lsquic_stream_t *s); 214 215 void (*on_read) (lsquic_stream_t *s, lsquic_stream_ctx_t *h); 216 void (*on_write) (lsquic_stream_t *s, lsquic_stream_ctx_t *h); 217 void (*on_close) (lsquic_stream_t *s, lsquic_stream_ctx_t *h); 218 /* This callback in only called in client mode */ 219 /** 220 * When handshake is completed, this callback is called. `ok' is set 221 * to true if handshake was successful; otherwise, `ok' is set to 222 * false. 223 * 224 * This callback is optional. 225 */ 226 void (*on_hsk_done)(lsquic_conn_t *c, enum lsquic_hsk_status s); 227 /** 228 * When server sends a token in NEW_TOKEN frame, this callback is called. 229 * The callback is optional. 230 */ 231 void (*on_new_token)(lsquic_conn_t *c, const unsigned char *token, 232 size_t token_size); 233 /** 234 * This optional callback lets client record information needed to 235 * perform a zero-RTT handshake next time around. 236 */ 237 void (*on_zero_rtt_info)(lsquic_conn_t *c, const unsigned char *, size_t); 238}; 239 240struct ssl_ctx_st; 241struct ssl_st; 242 243/** 244 * QUIC engine in server role needs access to certificates. This is 245 * accomplished by providing a callback and a context to the engine 246 * constructor. 247 */ 248 249typedef struct ssl_ctx_st * (*lsquic_lookup_cert_f)( 250 void *lsquic_cert_lookup_ctx, const struct sockaddr *local, const char *sni); 251 252/** 253 * Minimum flow control window is set to 16 KB for both client and server. 254 * This means we can send up to this amount of data before handshake gets 255 * completed. 256 */ 257#define LSQUIC_MIN_FCW (16 * 1024) 258 259/* Each LSQUIC_DF_* value corresponds to es_* entry in 260 * lsquic_engine_settings below. 261 */ 262 263/** 264 * By default, deprecated and experimental versions are not included. 265 */ 266#define LSQUIC_DF_VERSIONS (LSQUIC_SUPPORTED_VERSIONS & \ 267 ~LSQUIC_DEPRECATED_VERSIONS & \ 268 ~LSQUIC_EXPERIMENTAL_VERSIONS) 269 270#define LSQUIC_DF_CFCW_SERVER (3 * 1024 * 1024 / 2) 271#define LSQUIC_DF_CFCW_CLIENT (15 * 1024 * 1024) 272#define LSQUIC_DF_SFCW_SERVER (1 * 1024 * 1024) 273#define LSQUIC_DF_SFCW_CLIENT (6 * 1024 * 1024) 274#define LSQUIC_DF_MAX_STREAMS_IN 100 275 276/* IQUIC uses different names for these: */ 277#define LSQUIC_DF_INIT_MAX_DATA_SERVER LSQUIC_DF_CFCW_SERVER 278#define LSQUIC_DF_INIT_MAX_DATA_CLIENT LSQUIC_DF_CFCW_CLIENT 279#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_SERVER LSQUIC_DF_SFCW_SERVER 280#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_LOCAL_SERVER 0 281#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_CLIENT 0 282#define LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_LOCAL_CLIENT LSQUIC_DF_SFCW_CLIENT 283#define LSQUIC_DF_INIT_MAX_STREAMS_BIDI LSQUIC_DF_MAX_STREAMS_IN 284#define LSQUIC_DF_INIT_MAX_STREAMS_UNI_CLIENT 100 285#define LSQUIC_DF_INIT_MAX_STREAMS_UNI_SERVER 3 286/* XXX What's a good value here? */ 287#define LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_CLIENT (32 * 1024) 288#define LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER (12 * 1024) 289 290/** 291 * Default idle connection time in seconds. 292 */ 293#define LSQUIC_DF_IDLE_TIMEOUT 30 294 295/** 296 * Default ping period in seconds. 297 */ 298#define LSQUIC_DF_PING_PERIOD 15 299 300/** 301 * Default handshake timeout in microseconds. 302 */ 303#define LSQUIC_DF_HANDSHAKE_TO (10 * 1000 * 1000) 304 305#define LSQUIC_DF_IDLE_CONN_TO (LSQUIC_DF_IDLE_TIMEOUT * 1000 * 1000) 306#define LSQUIC_DF_SILENT_CLOSE 1 307 308/** Default value of maximum header list size. If set to non-zero value, 309 * SETTINGS_MAX_HEADER_LIST_SIZE will be sent to peer after handshake is 310 * completed (assuming the peer supports this setting frame type). 311 */ 312#define LSQUIC_DF_MAX_HEADER_LIST_SIZE 0 313 314/** Default value of UAID (user-agent ID). */ 315#define LSQUIC_DF_UA "LSQUIC" 316 317#define LSQUIC_DF_STTL 86400 318#define LSQUIC_DF_MAX_INCHOATE (1 * 1000 * 1000) 319#define LSQUIC_DF_SUPPORT_SREJ_SERVER 1 320#define LSQUIC_DF_SUPPORT_SREJ_CLIENT 0 /* TODO: client support */ 321/** Do not use NSTP by default */ 322#define LSQUIC_DF_SUPPORT_NSTP 0 323/** TODO: IETF QUIC clients do not support push */ 324#define LSQUIC_DF_SUPPORT_PUSH 1 325#define LSQUIC_DF_SUPPORT_TCID0 1 326/** By default, LSQUIC ignores Public Reset packets. */ 327#define LSQUIC_DF_HONOR_PRST 0 328 329/** 330 * By default, LSQUIC will not send Public Reset packets in response to 331 * packets that specify unknown connections. 332 */ 333#define LSQUIC_DF_SEND_PRST 0 334 335/** By default, infinite loop checks are turned on */ 336#define LSQUIC_DF_PROGRESS_CHECK 1000 337 338/** By default, read/write events are dispatched in a loop */ 339#define LSQUIC_DF_RW_ONCE 0 340 341/** By default, the threshold is not enabled */ 342#define LSQUIC_DF_PROC_TIME_THRESH 0 343 344/** By default, packets are paced */ 345#define LSQUIC_DF_PACE_PACKETS 1 346 347/** Default clock granularity is 1000 microseconds */ 348#define LSQUIC_DF_CLOCK_GRANULARITY 1000 349 350/** The default value is 8 for simplicity */ 351#define LSQUIC_DF_SCID_LEN 8 352 353/** The default value is 60 CIDs per minute */ 354#define LSQUIC_DF_SCID_ISS_RATE 60 355 356#define LSQUIC_DF_QPACK_DEC_MAX_BLOCKED 100 357#define LSQUIC_DF_QPACK_DEC_MAX_SIZE 4096 358#define LSQUIC_DF_QPACK_ENC_MAX_BLOCKED 100 359#define LSQUIC_DF_QPACK_ENC_MAX_SIZE 4096 360 361/** ECN is disabled by default */ 362#define LSQUIC_DF_ECN 0 363 364/** Allow migration by default */ 365#define LSQUIC_DF_ALLOW_MIGRATION 1 366 367/* 1: Cubic; 2: BBR */ 368#define LSQUIC_DF_CC_ALGO 2 369 370struct lsquic_engine_settings { 371 /** 372 * This is a bit mask wherein each bit corresponds to a value in 373 * enum lsquic_version. Client starts negotiating with the highest 374 * version and goes down. Server supports either of the versions 375 * specified here. 376 * 377 * This setting applies to both Google and IETF QUIC. 378 * 379 * @see lsquic_version 380 */ 381 unsigned es_versions; 382 383 /** 384 * Initial default CFCW. 385 * 386 * In server mode, per-connection values may be set lower than 387 * this if resources are scarce. 388 * 389 * Do not set es_cfcw and es_sfcw lower than @ref LSQUIC_MIN_FCW. 390 * 391 * @see es_max_cfcw 392 */ 393 unsigned es_cfcw; 394 395 /** 396 * Initial default SFCW. 397 * 398 * In server mode, per-connection values may be set lower than 399 * this if resources are scarce. 400 * 401 * Do not set es_cfcw and es_sfcw lower than @ref LSQUIC_MIN_FCW. 402 * 403 * @see es_max_sfcw 404 */ 405 unsigned es_sfcw; 406 407 /** 408 * This value is used to specify maximum allowed value CFCW is allowed 409 * to reach due to window auto-tuning. By default, this value is zero, 410 * which means that CFCW is not allowed to increase from its initial 411 * value. 412 * 413 * @see es_cfcw 414 */ 415 unsigned es_max_cfcw; 416 417 unsigned es_max_sfcw; 418 419 /** MIDS */ 420 unsigned es_max_streams_in; 421 422 /** 423 * Handshake timeout in microseconds. 424 * 425 * For client, this can be set to an arbitrary value (zero turns the 426 * timeout off). 427 * 428 * For server, this value is limited to about 16 seconds. Do not set 429 * it to zero. 430 */ 431 unsigned long es_handshake_to; 432 433 /** ICSL in microseconds; GQUIC only */ 434 unsigned long es_idle_conn_to; 435 436 /** SCLS (silent close) */ 437 int es_silent_close; 438 439 /** 440 * This corresponds to SETTINGS_MAX_HEADER_LIST_SIZE 441 * (RFC 7540, Section 6.5.2). 0 means no limit. Defaults 442 * to @ref LSQUIC_DF_MAX_HEADER_LIST_SIZE. 443 */ 444 unsigned es_max_header_list_size; 445 446 /** UAID -- User-Agent ID. Defaults to @ref LSQUIC_DF_UA. */ 447 const char *es_ua; 448 449 /** 450 * More parameters for server 451 */ 452 uint64_t es_sttl; /* SCFG TTL in seconds */ 453 454 uint32_t es_pdmd; /* One fixed value X509 */ 455 uint32_t es_aead; /* One fixed value AESG */ 456 uint32_t es_kexs; /* One fixed value C255 */ 457 458 /* Maximum number of incoming connections in inchoate state. This is 459 * only applicable in server mode. 460 */ 461 unsigned es_max_inchoate; 462 463 /** 464 * Support SREJ: for client side, this means supporting server's SREJ 465 * responses (this does not work yet) and for server side, this means 466 * generating SREJ instead of REJ when appropriate. 467 */ 468 int es_support_srej; 469 470 /** 471 * Setting this value to 0 means that 472 * 473 * For client: 474 * a) we send a SETTINGS frame to indicate that we do not support server 475 * push; and 476 * b) All incoming pushed streams get reset immediately. 477 * (For maximum effect, set es_max_streams_in to 0.) 478 * 479 * For server: 480 * lsquic_conn_push_stream() will return -1. 481 */ 482 int es_support_push; 483 484 /** 485 * If set to true value, the server will not include connection ID in 486 * outgoing packets if client's CHLO specifies TCID=0. 487 * 488 * For client, this means including TCID=0 into CHLO message. Note that 489 * in this case, the engine tracks connections by the 490 * (source-addr, dest-addr) tuple, thereby making it necessary to create 491 * a socket for each connection. 492 * 493 * This option has no effect in Q046, as the server never includes 494 * CIDs in the short packets. 495 * 496 * The default is @ref LSQUIC_DF_SUPPORT_TCID0. 497 */ 498 int es_support_tcid0; 499 500 /** 501 * Q037 and higher support "No STOP_WAITING frame" mode. When set, the 502 * client will send NSTP option in its Client Hello message and will not 503 * sent STOP_WAITING frames, while ignoring incoming STOP_WAITING frames, 504 * if any. Note that if the version negotiation happens to downgrade the 505 * client below Q037, this mode will *not* be used. 506 * 507 * This option does not affect the server, as it must support NSTP mode 508 * if it was specified by the client. 509 */ 510 int es_support_nstp; 511 512 /** 513 * If set to true value, the library will drop connections when it 514 * receives corresponding Public Reset packet. The default is to 515 * ignore these packets. 516 */ 517 int es_honor_prst; 518 519 /** 520 * If set to true value, the library will send Public Reset packets 521 * in response to incoming packets with unknown Connection IDs. 522 * The default is @ref LSQUIC_DF_SEND_PRST. 523 */ 524 int es_send_prst; 525 526 /** 527 * A non-zero value enables internal checks that identify suspected 528 * infinite loops in user @ref on_read and @ref on_write callbacks 529 * and break them. An infinite loop may occur if user code keeps 530 * on performing the same operation without checking status, e.g. 531 * reading from a closed stream etc. 532 * 533 * The value of this parameter is as follows: should a callback return 534 * this number of times in a row without making progress (that is, 535 * reading, writing, or changing stream state), loop break will occur. 536 * 537 * The defaut value is @ref LSQUIC_DF_PROGRESS_CHECK. 538 */ 539 unsigned es_progress_check; 540 541 /** 542 * A non-zero value make stream dispatch its read-write events once 543 * per call. 544 * 545 * When zero, read and write events are dispatched until the stream 546 * is no longer readable or writeable, respectively, or until the 547 * user signals unwillingness to read or write using 548 * @ref lsquic_stream_wantread() or @ref lsquic_stream_wantwrite() 549 * or shuts down the stream. 550 * 551 * The default value is @ref LSQUIC_DF_RW_ONCE. 552 */ 553 int es_rw_once; 554 555 /** 556 * If set, this value specifies that number of microseconds that 557 * @ref lsquic_engine_process_conns() and 558 * @ref lsquic_engine_send_unsent_packets() are allowed to spend 559 * before returning. 560 * 561 * This is not an exact science and the connections must make 562 * progress, so the deadline is checked after all connections get 563 * a chance to tick (in the case of @ref lsquic_engine_process_conns()) 564 * and at least one batch of packets is sent out. 565 * 566 * When processing function runs out of its time slice, immediate 567 * calls to @ref lsquic_engine_has_unsent_packets() return false. 568 * 569 * The default value is @ref LSQUIC_DF_PROC_TIME_THRESH. 570 */ 571 unsigned es_proc_time_thresh; 572 573 /** 574 * If set to true, packet pacing is implemented per connection. 575 * 576 * The default value is @ref LSQUIC_DF_PACE_PACKETS. 577 */ 578 int es_pace_packets; 579 580 /** 581 * Clock granularity information is used by the pacer. The value 582 * is in microseconds; default is @ref LSQUIC_DF_CLOCK_GRANULARITY. 583 */ 584 unsigned es_clock_granularity; 585 586 /* The following settings are specific to IETF QUIC. */ 587 /* vvvvvvvvvvv */ 588 589 /** 590 * Initial max data. 591 * 592 * This is a transport parameter. 593 * 594 * Depending on the engine mode, the default value is either 595 * @ref LSQUIC_DF_INIT_MAX_DATA_CLIENT or 596 * @ref LSQUIC_DF_INIT_MAX_DATA_SERVER. 597 */ 598 unsigned es_init_max_data; 599 600 /** 601 * Initial max stream data. 602 * 603 * This is a transport parameter. 604 * 605 * Depending on the engine mode, the default value is either 606 * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_CLIENT or 607 * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_BIDI_REMOTE_SERVER. 608 */ 609 unsigned es_init_max_stream_data_bidi_remote; 610 unsigned es_init_max_stream_data_bidi_local; 611 612 /** 613 * Initial max stream data for unidirectional streams initiated 614 * by remote endpoint. 615 * 616 * This is a transport parameter. 617 * 618 * Depending on the engine mode, the default value is either 619 * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_CLIENT or 620 * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER. 621 */ 622 unsigned es_init_max_stream_data_uni; 623 624 /** 625 * Maximum initial number of bidirectional stream. 626 * 627 * This is a transport parameter. 628 * 629 * Default value is @ref LSQUIC_DF_INIT_MAX_STREAMS_BIDI. 630 */ 631 unsigned es_init_max_streams_bidi; 632 633 /** 634 * Maximum initial number of unidirectional stream. 635 * 636 * This is a transport parameter. 637 * 638 * Default value is @ref LSQUIC_DF_INIT_MAX_STREAMS_UNI_CLIENT or 639 * @ref LSQUIC_DF_INIT_MAX_STREAM_DATA_UNI_SERVER. 640 */ 641 unsigned es_init_max_streams_uni; 642 643 /** 644 * Idle connection timeout. 645 * 646 * This is a transport parameter. 647 * 648 * (Note: es_idle_conn_to is not reused because it is in microseconds, 649 * which, I now realize, was not a good choice. Since it will be 650 * obsoleted some time after the switchover to IETF QUIC, we do not 651 * have to keep on using strange units.) 652 * 653 * Default value is @ref LSQUIC_DF_IDLE_TIMEOUT. 654 * 655 * Maximum value is 600 seconds. 656 */ 657 unsigned es_idle_timeout; 658 659 /** 660 * Ping period. If set to non-zero value, the connection will generate and 661 * send PING frames in the absence of other activity. 662 * 663 * By default, the server does not send PINGs and the period is set to zero. 664 * The client's defaut value is @ref LSQUIC_DF_PING_PERIOD. 665 */ 666 unsigned es_ping_period; 667 668 /** 669 * Source Connection ID length. Only applicable to the IETF QUIC 670 * versions. Valid values are 4 through 18, inclusive. 671 * 672 * Default value is @ref LSQUIC_DF_SCID_LEN. 673 */ 674 unsigned es_scid_len; 675 676 /** 677 * Source Connection ID issuance rate. Only applicable to the IETF QUIC 678 * versions. This field is measured in CIDs per minute. Using value 0 679 * indicates that there is no rate limit for CID issuance. 680 * 681 * Default value is @ref LSQUIC_DF_SCID_ISS_RATE. 682 */ 683 unsigned es_scid_iss_rate; 684 685 /** 686 * Maximum size of the QPACK dynamic table that the QPACK decoder will 687 * use. 688 * 689 * The default is @ref LSQUIC_DF_QPACK_DEC_MAX_SIZE. 690 */ 691 unsigned es_qpack_dec_max_size; 692 693 /** 694 * Maximum number of blocked streams that the QPACK decoder is willing 695 * to tolerate. 696 * 697 * The default is @ref LSQUIC_DF_QPACK_DEC_MAX_BLOCKED. 698 */ 699 unsigned es_qpack_dec_max_blocked; 700 701 /** 702 * Maximum size of the dynamic table that the encoder is willing to use. 703 * The actual size of the dynamic table will not exceed the minimum of 704 * this value and the value advertized by peer. 705 * 706 * The default is @ref LSQUIC_DF_QPACK_ENC_MAX_SIZE. 707 */ 708 unsigned es_qpack_enc_max_size; 709 710 /** 711 * Maximum number of blocked streams that the QPACK encoder is willing 712 * to risk. The actual number of blocked streams will not exceed the 713 * minimum of this value and the value advertized by peer. 714 * 715 * The default is @ref LSQUIC_DF_QPACK_ENC_MAX_BLOCKED. 716 */ 717 unsigned es_qpack_enc_max_blocked; 718 719 /** 720 * Enable ECN support. 721 * 722 * The default is @ref LSQUIC_DF_ECN 723 */ 724 int es_ecn; 725 726 /** 727 * Allow peer to migrate connection. 728 * 729 * The default is @ref LSQUIC_DF_ALLOW_MIGRATION 730 */ 731 int es_allow_migration; 732 733 /** 734 * Congestion control algorithm to use. 735 * 736 * 0: Use default (@ref LSQUIC_DF_CC_ALGO) 737 * 1: Cubic 738 * 2: BBR 739 */ 740 unsigned es_cc_algo; 741}; 742 743/* Initialize `settings' to default values */ 744void 745lsquic_engine_init_settings (struct lsquic_engine_settings *, 746 unsigned lsquic_engine_flags); 747 748/** 749 * Check settings for errors. 750 * 751 * @param settings Settings struct. 752 * 753 * @param flags Engine flags. 754 * 755 * @param err_buf Optional pointer to buffer into which error string 756 * is written. 757 758 * @param err_buf_sz Size of err_buf. No more than this number of bytes 759 * will be written to err_buf, including the NUL byte. 760 * 761 * @retval 0 Settings have no errors. 762 * @retval -1 There are errors in settings. 763 */ 764int 765lsquic_engine_check_settings (const struct lsquic_engine_settings *settings, 766 unsigned lsquic_engine_flags, 767 char *err_buf, size_t err_buf_sz); 768 769struct lsquic_out_spec 770{ 771 struct iovec *iov; 772 size_t iovlen; 773 const struct sockaddr *local_sa; 774 const struct sockaddr *dest_sa; 775 void *peer_ctx; 776 int ecn; /* Valid values are 0 - 3. See RFC 3168 */ 777}; 778 779/** 780 * Returns number of packets successfully sent out or -1 on error. -1 should 781 * only be returned if no packets were sent out. If -1 is returned or if the 782 * return value is smaller than `n_packets_out', this indicates that sending 783 * of packets is not possible No packets will be attempted to be sent out 784 * until @ref lsquic_engine_send_unsent_packets() is called. 785 */ 786typedef int (*lsquic_packets_out_f)( 787 void *packets_out_ctx, 788 const struct lsquic_out_spec *out_spec, 789 unsigned n_packets_out 790); 791 792/** 793 * The shared hash interface is used to share data between multiple LSQUIC 794 * instances. 795 */ 796struct lsquic_shared_hash_if 797{ 798 /** 799 * If you want your item to never expire, set `expiry' to zero. 800 * Returns 0 on success, -1 on failure. 801 * 802 * If inserted successfully, `free()' will be called on `data' and 'key' 803 * pointer when the element is deleted, whether due to expiration 804 * or explicit deletion. 805 */ 806 int (*shi_insert)(void *shi_ctx, void *key, unsigned key_sz, 807 void *data, unsigned data_sz, time_t expiry); 808 /** 809 * Returns 0 on success, -1 on failure. 810 */ 811 int (*shi_delete)(void *shi_ctx, const void *key, unsigned key_sz); 812 813 /** 814 * `data' is pointed to the result and `data_sz' is set to the 815 * object size. The implementation may choose to copy the object 816 * into buffer pointed to by `data', so you should have it ready. 817 * 818 * @retval 1 found. 819 * @retval 0 not found. 820 * @retval -1 error (perhaps not enough room in `data' if copy was 821 * attempted). 822 */ 823 int (*shi_lookup)(void *shi_ctx, const void *key, unsigned key_sz, 824 void **data, unsigned *data_sz); 825}; 826 827/** 828 * The packet out memory interface is used by LSQUIC to get buffers to 829 * which outgoing packets will be written before they are passed to 830 * ea_packets_out callback. 831 * 832 * If not specified, malloc() and free() are used. 833 */ 834struct lsquic_packout_mem_if 835{ 836 /** 837 * Allocate buffer for sending. 838 */ 839 void * (*pmi_allocate) (void *pmi_ctx, void *conn_ctx, unsigned short sz, 840 char is_ipv6); 841 /** 842 * This function is used to release the allocated buffer after it is 843 * sent via @ref ea_packets_out. 844 */ 845 void (*pmi_release) (void *pmi_ctx, void *conn_ctx, void *buf, 846 char is_ipv6); 847 /** 848 * If allocated buffer is not going to be sent, return it to the caller 849 * using this function. 850 */ 851 void (*pmi_return) (void *pmi_ctx, void *conn_ctx, void *buf, 852 char is_ipv6); 853}; 854 855typedef void (*lsquic_cids_update_f)(void *ctx, void **peer_ctx, 856 const lsquic_cid_t *cids, unsigned n_cids); 857 858struct stack_st_X509; 859 860/** 861 * When headers are processed, various errors may occur. They are listed 862 * in this enum. 863 */ 864enum lsquic_header_status 865{ 866 LSQUIC_HDR_OK, 867 /** Duplicate pseudo-header */ 868 LSQUIC_HDR_ERR_DUPLICATE_PSDO_HDR, 869 /** Not all request pseudo-headers are present */ 870 LSQUIC_HDR_ERR_INCOMPL_REQ_PSDO_HDR, 871 /** Unnecessary request pseudo-header present in the response */ 872 LSQUIC_HDR_ERR_UNNEC_REQ_PSDO_HDR, 873 /** Prohibited header in request */ 874 LSQUIC_HDR_ERR_BAD_REQ_HEADER, 875 /** Not all response pseudo-headers are present */ 876 LSQUIC_HDR_ERR_INCOMPL_RESP_PSDO_HDR, 877 /** Unnecessary response pseudo-header present in the response. */ 878 LSQUIC_HDR_ERR_UNNEC_RESP_PSDO_HDR, 879 /** Unknown pseudo-header */ 880 LSQUIC_HDR_ERR_UNKNOWN_PSDO_HDR, 881 /** Uppercase letter in header */ 882 LSQUIC_HDR_ERR_UPPERCASE_HEADER, 883 /** Misplaced pseudo-header */ 884 LSQUIC_HDR_ERR_MISPLACED_PSDO_HDR, 885 /** Missing pseudo-header */ 886 LSQUIC_HDR_ERR_MISSING_PSDO_HDR, 887 /** Header or headers are too large */ 888 LSQUIC_HDR_ERR_HEADERS_TOO_LARGE, 889 /** Cannot allocate any more memory. */ 890 LSQUIC_HDR_ERR_NOMEM, 891}; 892 893struct lsquic_hset_if 894{ 895 /** 896 * Create a new header set. This object is (and must be) fetched from a 897 * stream by calling @ref lsquic_stream_get_hset() before the stream can 898 * be read. 899 */ 900 void * (*hsi_create_header_set)(void *hsi_ctx, 901 int is_push_promise); 902 /** 903 * Process new header. Return 0 on success, -1 if there is a problem with 904 * the header. -1 is treated as a stream error: the associated stream is 905 * reset. 906 * 907 * `hdr_set' is the header set object returned by 908 * @ref hsi_create_header_set(). 909 * 910 * `name_idx' is set to the index in either the HPACK or QPACK static table 911 * whose entry's name element matches `name'. The values are as follows: 912 * - if there is no such match, `name_idx' is set to zero; 913 * - if HPACK is used, the value is between 1 and 61; and 914 * - if QPACK is used, the value is 62+ (subtract 62 to get the QPACK 915 * static table index). 916 * 917 * If `name' is NULL, this means that no more header are going to be 918 * added to the set. 919 */ 920 enum lsquic_header_status (*hsi_process_header)(void *hdr_set, 921 unsigned name_idx, 922 const char *name, unsigned name_len, 923 const char *value, unsigned value_len); 924 /** 925 * Discard header set. This is called for unclaimed header sets and 926 * header sets that had an error. 927 */ 928 void (*hsi_discard_header_set)(void *hdr_set); 929}; 930 931/** 932 * SSL keylog interface. 933 */ 934struct lsquic_keylog_if 935{ 936 /** Return keylog handle or NULL if no key logging is desired */ 937 void * (*kli_open) (void *keylog_ctx, lsquic_conn_t *); 938 939 /** 940 * Log line. The first argument is the pointer returned by 941 * @ref kli_open. 942 */ 943 void (*kli_log_line) (void *handle, const char *line); 944 945 /** 946 * Close handle. 947 */ 948 void (*kli_close) (void *handle); 949}; 950 951/* TODO: describe this important data structure */ 952typedef struct lsquic_engine_api 953{ 954 const struct lsquic_engine_settings *ea_settings; /* Optional */ 955 const struct lsquic_stream_if *ea_stream_if; 956 void *ea_stream_if_ctx; 957 lsquic_packets_out_f ea_packets_out; 958 void *ea_packets_out_ctx; 959 lsquic_lookup_cert_f ea_lookup_cert; 960 void *ea_cert_lu_ctx; 961 struct ssl_ctx_st * (*ea_get_ssl_ctx)(void *peer_ctx); 962 /** 963 * Shared hash interface is optional. If set to zero, performance of 964 * multiple LSQUIC instances will be degraded. 965 */ 966 const struct lsquic_shared_hash_if *ea_shi; 967 void *ea_shi_ctx; 968 /** 969 * Memory interface is optional. 970 */ 971 const struct lsquic_packout_mem_if *ea_pmi; 972 void *ea_pmi_ctx; 973 /** 974 * Optional interface to report new and old source connection IDs. 975 */ 976 lsquic_cids_update_f ea_new_scids; 977 lsquic_cids_update_f ea_live_scids; 978 lsquic_cids_update_f ea_old_scids; 979 void *ea_cids_update_ctx; 980 /** 981 * Function to verify server certificate. The chain contains at least 982 * one element. The first element in the chain is the server 983 * certificate. The chain belongs to the library. If you want to 984 * retain it, call sk_X509_up_ref(). 985 * 986 * 0 is returned on success, -1 on error. 987 * 988 * If the function pointer is not set, no verification is performed 989 * (the connection is allowed to proceed). 990 */ 991 int (*ea_verify_cert)(void *verify_ctx, 992 struct stack_st_X509 *chain); 993 void *ea_verify_ctx; 994 995 /** 996 * Optional header set interface. If not specified, the incoming headers 997 * are converted to HTTP/1.x format and are read from stream and have to 998 * be parsed again. 999 */ 1000 const struct lsquic_hset_if *ea_hsi_if; 1001 void *ea_hsi_ctx; 1002#if LSQUIC_CONN_STATS 1003 /** 1004 * If set, engine will print cumulative connection statistics to this 1005 * file just before it is destroyed. 1006 */ 1007 void /* FILE, really */ *ea_stats_fh; 1008#endif 1009 1010 /** 1011 * Optional SSL key logging interface. 1012 */ 1013 const struct lsquic_keylog_if *ea_keylog_if; 1014 void *ea_keylog_ctx; 1015} lsquic_engine_api_t; 1016 1017/** 1018 * Create new engine. 1019 * 1020 * @param lsquic_engine_flags A bitmask of @ref LSENG_SERVER and 1021 * @ref LSENG_HTTP 1022 */ 1023lsquic_engine_t * 1024lsquic_engine_new (unsigned lsquic_engine_flags, 1025 const struct lsquic_engine_api *); 1026 1027/** 1028 * Create a client connection to peer identified by `peer_ctx'. 1029 * 1030 * To let the engine specify QUIC version, use N_LSQVER. If zero-rtt info 1031 * is supplied, version is picked from there instead. 1032 * 1033 * If `max_packet_size' is set to zero, it is inferred based on `peer_sa': 1034 * 1350 for IPv6 and 1370 for IPv4. 1035 */ 1036lsquic_conn_t * 1037lsquic_engine_connect (lsquic_engine_t *, enum lsquic_version, 1038 const struct sockaddr *local_sa, 1039 const struct sockaddr *peer_sa, 1040 void *peer_ctx, lsquic_conn_ctx_t *conn_ctx, 1041 const char *hostname, unsigned short max_packet_size, 1042 const unsigned char *zero_rtt, size_t zero_rtt_len, 1043 /** Resumption token: optional */ 1044 const unsigned char *token, size_t token_sz); 1045 1046/** 1047 * Pass incoming packet to the QUIC engine. This function can be called 1048 * more than once in a row. After you add one or more packets, call 1049 * lsquic_engine_process_conns() to schedule output, if any. 1050 * 1051 * @retval 0 Packet was processed by a real connection. 1052 * 1053 * @retval 1 Packet was handled successfully, but not by a connection. 1054 * This may happen with version negotiation and public reset 1055 * packets as well as some packets that may be ignored. 1056 * 1057 * @retval -1 Some error occurred. Possible reasons are invalid packet 1058 * size or failure to allocate memory. 1059 */ 1060int 1061lsquic_engine_packet_in (lsquic_engine_t *, 1062 const unsigned char *packet_in_data, size_t packet_in_size, 1063 const struct sockaddr *sa_local, const struct sockaddr *sa_peer, 1064 void *peer_ctx, int ecn); 1065 1066/** 1067 * Process tickable connections. This function must be called often enough so 1068 * that packets and connections do not expire. 1069 */ 1070void 1071lsquic_engine_process_conns (lsquic_engine_t *engine); 1072 1073/** 1074 * Returns true if engine has some unsent packets. This happens if 1075 * @ref ea_packets_out() could not send everything out. 1076 */ 1077int 1078lsquic_engine_has_unsent_packets (lsquic_engine_t *engine); 1079 1080/** 1081 * Send out as many unsent packets as possibe: until we are out of unsent 1082 * packets or until @ref ea_packets_out() fails. 1083 * 1084 * If @ref ea_packets_out() does fail (that is, it returns an error), this 1085 * function must be called to signify that sending of packets is possible 1086 * again. 1087 */ 1088void 1089lsquic_engine_send_unsent_packets (lsquic_engine_t *engine); 1090 1091void 1092lsquic_engine_destroy (lsquic_engine_t *); 1093 1094/** Return max allowed outbound streams less current outbound streams. */ 1095unsigned 1096lsquic_conn_n_avail_streams (const lsquic_conn_t *); 1097 1098void 1099lsquic_conn_make_stream (lsquic_conn_t *); 1100 1101/** Return number of delayed streams currently pending */ 1102unsigned 1103lsquic_conn_n_pending_streams (const lsquic_conn_t *); 1104 1105/** Cancel `n' pending streams. Returns new number of pending streams. */ 1106unsigned 1107lsquic_conn_cancel_pending_streams (lsquic_conn_t *, unsigned n); 1108 1109/** 1110 * Mark connection as going away: send GOAWAY frame and do not accept 1111 * any more incoming streams, nor generate streams of our own. 1112 * 1113 * In the server mode, of course, we can call this function just fine in both 1114 * Google and IETF QUIC. 1115 * 1116 * In client mode, calling this function in for an IETF QUIC connection does 1117 * not do anything, as the client MUST NOT send GOAWAY frames. 1118 * See [draft-ietf-quic-http-17] Section 4.2.7. 1119 */ 1120void 1121lsquic_conn_going_away (lsquic_conn_t *); 1122 1123/** 1124 * This forces connection close. on_conn_closed and on_close callbacks 1125 * will be called. 1126 */ 1127void 1128lsquic_conn_close (lsquic_conn_t *); 1129 1130int lsquic_stream_wantread(lsquic_stream_t *s, int is_want); 1131ssize_t lsquic_stream_read(lsquic_stream_t *s, void *buf, size_t len); 1132ssize_t lsquic_stream_readv(lsquic_stream_t *s, const struct iovec *, 1133 int iovcnt); 1134 1135/** 1136 * This function allows user-supplied callback to read the stream contents. 1137 * It is meant to be used for zero-copy stream processing. 1138 */ 1139ssize_t 1140lsquic_stream_readf (lsquic_stream_t *s, 1141 /** 1142 * The callback takes four parameters: 1143 * - Pointer to user-supplied context; 1144 * - Pointer to the data; 1145 * - Data size (can be zero); and 1146 * - Indicator whether the FIN follows the data. 1147 * 1148 * The callback returns number of bytes processed. If this number is zero 1149 * or is smaller than `len', reading from stream stops. 1150 */ 1151 size_t (*readf)(void *ctx, const unsigned char *buf, size_t len, int fin), 1152 void *ctx); 1153 1154int lsquic_stream_wantwrite(lsquic_stream_t *s, int is_want); 1155 1156/** 1157 * Write `len' bytes to the stream. Returns number of bytes written, which 1158 * may be smaller that `len'. 1159 */ 1160ssize_t lsquic_stream_write(lsquic_stream_t *s, const void *buf, size_t len); 1161 1162ssize_t lsquic_stream_writev(lsquic_stream_t *s, const struct iovec *vec, int count); 1163 1164/** 1165 * Used as argument to @ref lsquic_stream_writef() 1166 */ 1167struct lsquic_reader 1168{ 1169 /** 1170 * Not a ssize_t because the read function is not supposed to return 1171 * an error. If an error occurs in the read function (for example, when 1172 * reading from a file fails), it is supposed to deal with the error 1173 * itself. 1174 */ 1175 size_t (*lsqr_read) (void *lsqr_ctx, void *buf, size_t count); 1176 /** 1177 * Return number of bytes remaining in the reader. 1178 */ 1179 size_t (*lsqr_size) (void *lsqr_ctx); 1180 void *lsqr_ctx; 1181}; 1182 1183/** 1184 * Write to stream using @ref lsquic_reader. This is the most generic of 1185 * the write functions -- @ref lsquic_stream_write() and 1186 * @ref lsquic_stream_writev() utilize the same mechanism. 1187 * 1188 * @retval Number of bytes written or -1 on error. 1189 */ 1190ssize_t 1191lsquic_stream_writef (lsquic_stream_t *, struct lsquic_reader *); 1192 1193/** 1194 * Flush any buffered data. This triggers packetizing even a single byte 1195 * into a separate frame. Flushing a closed stream is an error. 1196 * 1197 * @retval 0 Success 1198 * @retval -1 Failure 1199 */ 1200int 1201lsquic_stream_flush (lsquic_stream_t *s); 1202 1203/** 1204 * @typedef lsquic_http_header_t 1205 * @brief HTTP header structure. Contains header name and value. 1206 * 1207 */ 1208typedef struct lsquic_http_header 1209{ 1210 struct iovec name; 1211 struct iovec value; 1212} lsquic_http_header_t; 1213 1214/** 1215 * @typedef lsquic_http_headers_t 1216 * @brief HTTP header list structure. Contains a list of HTTP headers in key/value pairs. 1217 * used in API functions to pass headers. 1218 */ 1219struct lsquic_http_headers 1220{ 1221 int count; 1222 lsquic_http_header_t *headers; 1223}; 1224 1225int lsquic_stream_send_headers(lsquic_stream_t *s, 1226 const lsquic_http_headers_t *h, int eos); 1227 1228/** 1229 * Get header set associated with the stream. The header set is created by 1230 * @ref hsi_create_header_set() callback. After this call, the ownership of 1231 * the header set is trasnferred to the caller. 1232 * 1233 * This call must precede calls to @ref lsquic_stream_read() and 1234 * @ref lsquic_stream_readv(). 1235 * 1236 * If the optional header set interface (@ref ea_hsi_if) is not specified, 1237 * this function returns NULL. 1238 */ 1239void * 1240lsquic_stream_get_hset (lsquic_stream_t *); 1241 1242/** 1243 * A server may push a stream. This call creates a new stream in reference 1244 * to stream `s'. It will behave as if the client made a request: it will 1245 * trigger on_new_stream() event and it can be used as a regular client- 1246 * initiated stream. 1247 * 1248 * If `hdr_set' is not set, it is generated by using `ea_hsi_if' callbacks. 1249 * In either case, the header set object belongs to the connection. The 1250 * user is not to free this object until (@ref hsi_discard_header_set) is 1251 * called. 1252 * 1253 * @retval 0 Stream pushed successfully. 1254 * @retval 1 Stream push failed because it is disabled or because we hit 1255 * stream limit or connection is going away. 1256 * @retval -1 Stream push failed because of an internal error. 1257 */ 1258int 1259lsquic_conn_push_stream (lsquic_conn_t *c, void *hdr_set, lsquic_stream_t *s, 1260 const struct iovec* url, const struct iovec* authority, 1261 const lsquic_http_headers_t *headers); 1262 1263/** 1264 * Only makes sense in server mode: the client cannot push a stream and this 1265 * function always returns false in client mode. 1266 */ 1267int 1268lsquic_conn_is_push_enabled (lsquic_conn_t *); 1269 1270/** Possible values for how are 0, 1, and 2. See shutdown(2). */ 1271int lsquic_stream_shutdown(lsquic_stream_t *s, int how); 1272 1273int lsquic_stream_close(lsquic_stream_t *s); 1274 1275/** 1276 * Get certificate chain returned by the server. This can be used for 1277 * server certificate verifiction. 1278 * 1279 * If server certificate cannot be verified, the connection can be closed 1280 * using lsquic_conn_cert_verification_failed(). 1281 * 1282 * The caller releases the stack using sk_X509_free(). 1283 */ 1284struct stack_st_X509 * 1285lsquic_conn_get_server_cert_chain (lsquic_conn_t *); 1286 1287/** Returns ID of the stream */ 1288lsquic_stream_id_t 1289lsquic_stream_id (const lsquic_stream_t *s); 1290 1291/** 1292 * Returns stream ctx associated with the stream. (The context is what 1293 * is returned by @ref on_new_stream callback). 1294 */ 1295lsquic_stream_ctx_t * 1296lsquic_stream_get_ctx (const lsquic_stream_t *s); 1297 1298/** Returns true if this is a pushed stream */ 1299int 1300lsquic_stream_is_pushed (const lsquic_stream_t *s); 1301 1302/** 1303 * Returns true if this stream was rejected, false otherwise. Use this as 1304 * an aid to distinguish between errors. 1305 */ 1306int 1307lsquic_stream_is_rejected (const lsquic_stream_t *s); 1308 1309/** 1310 * Refuse pushed stream. Call it from @ref on_new_stream. 1311 * 1312 * No need to call lsquic_stream_close() after this. on_close will be called. 1313 * 1314 * @see lsquic_stream_is_pushed 1315 */ 1316int 1317lsquic_stream_refuse_push (lsquic_stream_t *s); 1318 1319/** 1320 * Get information associated with pushed stream: 1321 * 1322 * @param ref_stream_id Stream ID in response to which push promise was 1323 * sent. 1324 * @param hdr_set Header set. This object was passed to or generated 1325 * by @ref lsquic_conn_push_stream(). 1326 * 1327 * @retval 0 Success. 1328 * @retval -1 This is not a pushed stream. 1329 */ 1330int 1331lsquic_stream_push_info (const lsquic_stream_t *, 1332 lsquic_stream_id_t *ref_stream_id, void **hdr_set); 1333 1334/** Return current priority of the stream */ 1335unsigned lsquic_stream_priority (const lsquic_stream_t *s); 1336 1337/** 1338 * Set stream priority. Valid priority values are 1 through 256, inclusive. 1339 * 1340 * @retval 0 Success. 1341 * @retval -1 Priority value is invalid. 1342 */ 1343int lsquic_stream_set_priority (lsquic_stream_t *s, unsigned priority); 1344 1345/** 1346 * Get a pointer to the connection object. Use it with lsquic_conn_* 1347 * functions. 1348 */ 1349lsquic_conn_t * lsquic_stream_conn(const lsquic_stream_t *s); 1350 1351lsquic_stream_t * 1352lsquic_conn_get_stream_by_id (lsquic_conn_t *c, lsquic_stream_id_t stream_id); 1353 1354/** Get connection ID */ 1355const lsquic_cid_t * 1356lsquic_conn_id (const lsquic_conn_t *c); 1357 1358/** Get pointer to the engine */ 1359lsquic_engine_t * 1360lsquic_conn_get_engine (lsquic_conn_t *c); 1361 1362int 1363lsquic_conn_get_sockaddr(lsquic_conn_t *c, 1364 const struct sockaddr **local, const struct sockaddr **peer); 1365 1366struct lsquic_logger_if { 1367 int (*log_buf)(void *logger_ctx, const char *buf, size_t len); 1368}; 1369 1370/** 1371 * Enumerate timestamp styles supported by LSQUIC logger mechanism. 1372 */ 1373enum lsquic_logger_timestamp_style { 1374 /** 1375 * No timestamp is generated. 1376 */ 1377 LLTS_NONE, 1378 1379 /** 1380 * The timestamp consists of 24 hours, minutes, seconds, and 1381 * milliseconds. Example: 13:43:46.671 1382 */ 1383 LLTS_HHMMSSMS, 1384 1385 /** 1386 * Like above, plus date, e.g: 2017-03-21 13:43:46.671 1387 */ 1388 LLTS_YYYYMMDD_HHMMSSMS, 1389 1390 /** 1391 * This is Chrome-like timestamp used by proto-quic. The timestamp 1392 * includes month, date, hours, minutes, seconds, and microseconds. 1393 * 1394 * Example: 1223/104613.946956 (instead of 12/23 10:46:13.946956). 1395 * 1396 * This is to facilitate reading two logs side-by-side. 1397 */ 1398 LLTS_CHROMELIKE, 1399 1400 /** 1401 * The timestamp consists of 24 hours, minutes, seconds, and 1402 * microseconds. Example: 13:43:46.671123 1403 */ 1404 LLTS_HHMMSSUS, 1405 1406 /** 1407 * Date and time using microsecond resolution, 1408 * e.g: 2017-03-21 13:43:46.671123 1409 */ 1410 LLTS_YYYYMMDD_HHMMSSUS, 1411 1412 N_LLTS 1413}; 1414 1415/** 1416 * Call this if you want to do something with LSQUIC log messages, as they 1417 * are thrown out by default. 1418 */ 1419void lsquic_logger_init(const struct lsquic_logger_if *, void *logger_ctx, 1420 enum lsquic_logger_timestamp_style); 1421 1422/** 1423 * Set log level for all LSQUIC modules. Acceptable values are debug, info, 1424 * notice, warning, error, alert, emerg, crit (case-insensitive). 1425 * 1426 * @retval 0 Success. 1427 * @retval -1 Failure: log_level is not valid. 1428 */ 1429int 1430lsquic_set_log_level (const char *log_level); 1431 1432/** 1433 * E.g. "event=debug" 1434 */ 1435int 1436lsquic_logger_lopt (const char *optarg); 1437 1438/** 1439 * Return the list of QUIC versions (as bitmask) this engine instance 1440 * supports. 1441 */ 1442unsigned lsquic_engine_quic_versions (const lsquic_engine_t *); 1443 1444/** 1445 * This is one of the flags that can be passed to @ref lsquic_global_init. 1446 * Use it to initialize LSQUIC for use in client mode. 1447 */ 1448#define LSQUIC_GLOBAL_CLIENT (1 << 0) 1449 1450/** 1451 * This is one of the flags that can be passed to @ref lsquic_global_init. 1452 * Use it to initialize LSQUIC for use in server mode. 1453 */ 1454#define LSQUIC_GLOBAL_SERVER (1 << 1) 1455 1456/** 1457 * Initialize LSQUIC. This must be called before any other LSQUIC function 1458 * is called. Returns 0 on success and -1 on failure. 1459 * 1460 * @param flags This a bitmask of @ref LSQUIC_GLOBAL_CLIENT and 1461 * @ref LSQUIC_GLOBAL_SERVER. At least one of these 1462 * flags should be specified. 1463 * 1464 * @retval 0 Success. 1465 * @retval -1 Initialization failed. 1466 * 1467 * @see LSQUIC_GLOBAL_CLIENT 1468 * @see LSQUIC_GLOBAL_SERVER 1469 */ 1470int 1471lsquic_global_init (int flags); 1472 1473/** 1474 * Clean up global state created by @ref lsquic_global_init. Should be 1475 * called after all LSQUIC engine instances are gone. 1476 */ 1477void 1478lsquic_global_cleanup (void); 1479 1480/** 1481 * Get QUIC version used by the connection. 1482 * 1483 * @see lsquic_version 1484 */ 1485enum lsquic_version 1486lsquic_conn_quic_version (const lsquic_conn_t *c); 1487 1488/* Return keysize or -1 on error */ 1489int 1490lsquic_conn_crypto_keysize (const lsquic_conn_t *c); 1491 1492/* Return algorithm keysize or -1 on error */ 1493int 1494lsquic_conn_crypto_alg_keysize (const lsquic_conn_t *c); 1495 1496enum lsquic_crypto_ver 1497{ 1498 LSQ_CRY_QUIC, 1499 LSQ_CRY_TLSv13, 1500}; 1501 1502enum lsquic_crypto_ver 1503lsquic_conn_crypto_ver (const lsquic_conn_t *c); 1504 1505/* Return cipher or NULL on error */ 1506const char * 1507lsquic_conn_crypto_cipher (const lsquic_conn_t *c); 1508 1509/** Translate string QUIC version to LSQUIC QUIC version representation */ 1510enum lsquic_version 1511lsquic_str2ver (const char *str, size_t len); 1512 1513/** Translate ALPN (e.g. "h3", "h3-23", "h3-Q046") to LSQUIC enum */ 1514enum lsquic_version 1515lsquic_alpn2ver (const char *alpn, size_t len); 1516 1517/** 1518 * This function closes all mini connections and marks all full connection 1519 * as going away. In server mode, this also causes the engine to stop 1520 * creating new connections. 1521 */ 1522void 1523lsquic_engine_cooldown (lsquic_engine_t *); 1524 1525struct ssl_st * 1526lsquic_hsk_getssl(lsquic_conn_t *conn); 1527 1528/** 1529 * Get user-supplied context associated with the connection. 1530 */ 1531lsquic_conn_ctx_t * 1532lsquic_conn_get_ctx (const lsquic_conn_t *); 1533 1534/** 1535 * Set user-supplied context associated with the connection. 1536 */ 1537void 1538lsquic_conn_set_ctx (lsquic_conn_t *, lsquic_conn_ctx_t *); 1539 1540/** 1541 * Get peer context associated with the connection. 1542 */ 1543void * 1544lsquic_conn_get_peer_ctx (lsquic_conn_t *, const struct sockaddr *local_sa); 1545 1546/** 1547 * Abort connection. 1548 */ 1549void 1550lsquic_conn_abort (lsquic_conn_t *); 1551 1552/** 1553 * Helper function: convert list of versions as specified in the argument 1554 * bitmask to string that can be included as argument to "v=" part of the 1555 * Alt-Svc header. 1556 * 1557 * For example (1<<LSQVER_037)|(1<<LSQVER_038) => "37,38" 1558 * 1559 * This is only applicable to Google QUIC versions. 1560 */ 1561const char * 1562lsquic_get_alt_svc_versions (unsigned versions); 1563 1564/** 1565 * Return a NULL-terminated list of HTTP/3 ALPNs, e.g "h3-17", "h3-18", "h3". 1566 */ 1567const char *const * 1568lsquic_get_h3_alpns (unsigned versions); 1569 1570/** 1571 * Returns true if provided buffer could be a valid handshake-stage packet, 1572 * false otherwise. Do not call this function if a connection has already 1573 * been established: it will return incorrect result. 1574 */ 1575int 1576lsquic_is_valid_hs_packet (lsquic_engine_t *, const unsigned char *, size_t); 1577 1578/** 1579 * Parse cid from packet stored in `buf' and store it to `cid'. Returns 0 1580 * on success and -1 on failure. 1581 */ 1582int 1583lsquic_cid_from_packet (const unsigned char *, size_t bufsz, lsquic_cid_t *cid); 1584 1585/** 1586 * Returns true if there are connections to be processed, false otherwise. 1587 * If true, `diff' is set to the difference between the earliest advisory 1588 * tick time and now. If the former is in the past, the value of `diff' 1589 * is negative. 1590 */ 1591int 1592lsquic_engine_earliest_adv_tick (lsquic_engine_t *engine, int *diff); 1593 1594/** 1595 * Return number of connections whose advisory tick time is before current 1596 * time plus `from_now' microseconds from now. `from_now' can be negative. 1597 */ 1598unsigned 1599lsquic_engine_count_attq (lsquic_engine_t *engine, int from_now); 1600 1601enum LSQUIC_CONN_STATUS 1602{ 1603 LSCONN_ST_HSK_IN_PROGRESS, 1604 LSCONN_ST_CONNECTED, 1605 LSCONN_ST_HSK_FAILURE, 1606 LSCONN_ST_GOING_AWAY, 1607 LSCONN_ST_TIMED_OUT, 1608 /* If es_honor_prst is not set, the connection will never get public 1609 * reset packets and this flag will not be set. 1610 */ 1611 LSCONN_ST_RESET, 1612 LSCONN_ST_USER_ABORTED, 1613 LSCONN_ST_ERROR, 1614 LSCONN_ST_CLOSED, 1615 LSCONN_ST_PEER_GOING_AWAY, 1616}; 1617 1618enum LSQUIC_CONN_STATUS 1619lsquic_conn_status (lsquic_conn_t *, char *errbuf, size_t bufsz); 1620 1621extern const char *const 1622lsquic_ver2str[N_LSQVER]; 1623 1624#ifdef __cplusplus 1625} 1626#endif 1627 1628#endif //__LSQUIC_H__ 1629 1630