lsquic.h revision 65728dc5
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 4 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 * If `max_packet_size' is set to zero, it is inferred based on `peer_sa': 1030 * 1350 for IPv6 and 1370 for IPv4. 1031 */ 1032lsquic_conn_t * 1033lsquic_engine_connect (lsquic_engine_t *, const struct sockaddr *local_sa, 1034 const struct sockaddr *peer_sa, 1035 void *peer_ctx, lsquic_conn_ctx_t *conn_ctx, 1036 const char *hostname, unsigned short max_packet_size, 1037 const unsigned char *zero_rtt, size_t zero_rtt_len, 1038 /** Resumption token: optional */ 1039 const unsigned char *token, size_t token_sz); 1040 1041/** 1042 * Pass incoming packet to the QUIC engine. This function can be called 1043 * more than once in a row. After you add one or more packets, call 1044 * lsquic_engine_process_conns() to schedule output, if any. 1045 * 1046 * @retval 0 Packet was processed by a real connection. 1047 * 1048 * @retval 1 Packet was handled successfully, but not by a connection. 1049 * This may happen with version negotiation and public reset 1050 * packets as well as some packets that may be ignored. 1051 * 1052 * @retval -1 Some error occurred. Possible reasons are invalid packet 1053 * size or failure to allocate memory. 1054 */ 1055int 1056lsquic_engine_packet_in (lsquic_engine_t *, 1057 const unsigned char *packet_in_data, size_t packet_in_size, 1058 const struct sockaddr *sa_local, const struct sockaddr *sa_peer, 1059 void *peer_ctx, int ecn); 1060 1061/** 1062 * Process tickable connections. This function must be called often enough so 1063 * that packets and connections do not expire. 1064 */ 1065void 1066lsquic_engine_process_conns (lsquic_engine_t *engine); 1067 1068/** 1069 * Returns true if engine has some unsent packets. This happens if 1070 * @ref ea_packets_out() could not send everything out. 1071 */ 1072int 1073lsquic_engine_has_unsent_packets (lsquic_engine_t *engine); 1074 1075/** 1076 * Send out as many unsent packets as possibe: until we are out of unsent 1077 * packets or until @ref ea_packets_out() fails. 1078 * 1079 * If @ref ea_packets_out() does fail (that is, it returns an error), this 1080 * function must be called to signify that sending of packets is possible 1081 * again. 1082 */ 1083void 1084lsquic_engine_send_unsent_packets (lsquic_engine_t *engine); 1085 1086void 1087lsquic_engine_destroy (lsquic_engine_t *); 1088 1089/** Return max allowed outbound streams less current outbound streams. */ 1090unsigned 1091lsquic_conn_n_avail_streams (const lsquic_conn_t *); 1092 1093void 1094lsquic_conn_make_stream (lsquic_conn_t *); 1095 1096/** Return number of delayed streams currently pending */ 1097unsigned 1098lsquic_conn_n_pending_streams (const lsquic_conn_t *); 1099 1100/** Cancel `n' pending streams. Returns new number of pending streams. */ 1101unsigned 1102lsquic_conn_cancel_pending_streams (lsquic_conn_t *, unsigned n); 1103 1104/** 1105 * Mark connection as going away: send GOAWAY frame and do not accept 1106 * any more incoming streams, nor generate streams of our own. 1107 * 1108 * In the server mode, of course, we can call this function just fine in both 1109 * Google and IETF QUIC. 1110 * 1111 * In client mode, calling this function in for an IETF QUIC connection does 1112 * not do anything, as the client MUST NOT send GOAWAY frames. 1113 * See [draft-ietf-quic-http-17] Section 4.2.7. 1114 */ 1115void 1116lsquic_conn_going_away (lsquic_conn_t *); 1117 1118/** 1119 * This forces connection close. on_conn_closed and on_close callbacks 1120 * will be called. 1121 */ 1122void 1123lsquic_conn_close (lsquic_conn_t *); 1124 1125int lsquic_stream_wantread(lsquic_stream_t *s, int is_want); 1126ssize_t lsquic_stream_read(lsquic_stream_t *s, void *buf, size_t len); 1127ssize_t lsquic_stream_readv(lsquic_stream_t *s, const struct iovec *, 1128 int iovcnt); 1129 1130/** 1131 * This function allows user-supplied callback to read the stream contents. 1132 * It is meant to be used for zero-copy stream processing. 1133 */ 1134ssize_t 1135lsquic_stream_readf (lsquic_stream_t *s, 1136 /** 1137 * The callback takes four parameters: 1138 * - Pointer to user-supplied context; 1139 * - Pointer to the data; 1140 * - Data size (can be zero); and 1141 * - Indicator whether the FIN follows the data. 1142 * 1143 * The callback returns number of bytes processed. If this number is zero 1144 * or is smaller than `len', reading from stream stops. 1145 */ 1146 size_t (*readf)(void *ctx, const unsigned char *buf, size_t len, int fin), 1147 void *ctx); 1148 1149int lsquic_stream_wantwrite(lsquic_stream_t *s, int is_want); 1150 1151/** 1152 * Write `len' bytes to the stream. Returns number of bytes written, which 1153 * may be smaller that `len'. 1154 */ 1155ssize_t lsquic_stream_write(lsquic_stream_t *s, const void *buf, size_t len); 1156 1157ssize_t lsquic_stream_writev(lsquic_stream_t *s, const struct iovec *vec, int count); 1158 1159/** 1160 * Used as argument to @ref lsquic_stream_writef() 1161 */ 1162struct lsquic_reader 1163{ 1164 /** 1165 * Not a ssize_t because the read function is not supposed to return 1166 * an error. If an error occurs in the read function (for example, when 1167 * reading from a file fails), it is supposed to deal with the error 1168 * itself. 1169 */ 1170 size_t (*lsqr_read) (void *lsqr_ctx, void *buf, size_t count); 1171 /** 1172 * Return number of bytes remaining in the reader. 1173 */ 1174 size_t (*lsqr_size) (void *lsqr_ctx); 1175 void *lsqr_ctx; 1176}; 1177 1178/** 1179 * Write to stream using @ref lsquic_reader. This is the most generic of 1180 * the write functions -- @ref lsquic_stream_write() and 1181 * @ref lsquic_stream_writev() utilize the same mechanism. 1182 * 1183 * @retval Number of bytes written or -1 on error. 1184 */ 1185ssize_t 1186lsquic_stream_writef (lsquic_stream_t *, struct lsquic_reader *); 1187 1188/** 1189 * Flush any buffered data. This triggers packetizing even a single byte 1190 * into a separate frame. Flushing a closed stream is an error. 1191 * 1192 * @retval 0 Success 1193 * @retval -1 Failure 1194 */ 1195int 1196lsquic_stream_flush (lsquic_stream_t *s); 1197 1198/** 1199 * @typedef lsquic_http_header_t 1200 * @brief HTTP header structure. Contains header name and value. 1201 * 1202 */ 1203typedef struct lsquic_http_header 1204{ 1205 struct iovec name; 1206 struct iovec value; 1207} lsquic_http_header_t; 1208 1209/** 1210 * @typedef lsquic_http_headers_t 1211 * @brief HTTP header list structure. Contains a list of HTTP headers in key/value pairs. 1212 * used in API functions to pass headers. 1213 */ 1214struct lsquic_http_headers 1215{ 1216 int count; 1217 lsquic_http_header_t *headers; 1218}; 1219 1220int lsquic_stream_send_headers(lsquic_stream_t *s, 1221 const lsquic_http_headers_t *h, int eos); 1222 1223/** 1224 * Get header set associated with the stream. The header set is created by 1225 * @ref hsi_create_header_set() callback. After this call, the ownership of 1226 * the header set is trasnferred to the caller. 1227 * 1228 * This call must precede calls to @ref lsquic_stream_read() and 1229 * @ref lsquic_stream_readv(). 1230 * 1231 * If the optional header set interface (@ref ea_hsi_if) is not specified, 1232 * this function returns NULL. 1233 */ 1234void * 1235lsquic_stream_get_hset (lsquic_stream_t *); 1236 1237/** 1238 * A server may push a stream. This call creates a new stream in reference 1239 * to stream `s'. It will behave as if the client made a request: it will 1240 * trigger on_new_stream() event and it can be used as a regular client- 1241 * initiated stream. 1242 * 1243 * If `hdr_set' is not set, it is generated by using `ea_hsi_if' callbacks. 1244 * In either case, the header set object belongs to the connection. The 1245 * user is not to free this object until (@ref hsi_discard_header_set) is 1246 * called. 1247 * 1248 * @retval 0 Stream pushed successfully. 1249 * @retval 1 Stream push failed because it is disabled or because we hit 1250 * stream limit or connection is going away. 1251 * @retval -1 Stream push failed because of an internal error. 1252 */ 1253int 1254lsquic_conn_push_stream (lsquic_conn_t *c, void *hdr_set, lsquic_stream_t *s, 1255 const struct iovec* url, const struct iovec* authority, 1256 const lsquic_http_headers_t *headers); 1257 1258/** 1259 * Only makes sense in server mode: the client cannot push a stream and this 1260 * function always returns false in client mode. 1261 */ 1262int 1263lsquic_conn_is_push_enabled (lsquic_conn_t *); 1264 1265/** Possible values for how are 0, 1, and 2. See shutdown(2). */ 1266int lsquic_stream_shutdown(lsquic_stream_t *s, int how); 1267 1268int lsquic_stream_close(lsquic_stream_t *s); 1269 1270/** 1271 * Get certificate chain returned by the server. This can be used for 1272 * server certificate verifiction. 1273 * 1274 * If server certificate cannot be verified, the connection can be closed 1275 * using lsquic_conn_cert_verification_failed(). 1276 * 1277 * The caller releases the stack using sk_X509_free(). 1278 */ 1279struct stack_st_X509 * 1280lsquic_conn_get_server_cert_chain (lsquic_conn_t *); 1281 1282/** Returns ID of the stream */ 1283lsquic_stream_id_t 1284lsquic_stream_id (const lsquic_stream_t *s); 1285 1286/** 1287 * Returns stream ctx associated with the stream. (The context is what 1288 * is returned by @ref on_new_stream callback). 1289 */ 1290lsquic_stream_ctx_t * 1291lsquic_stream_get_ctx (const lsquic_stream_t *s); 1292 1293/** Returns true if this is a pushed stream */ 1294int 1295lsquic_stream_is_pushed (const lsquic_stream_t *s); 1296 1297/** 1298 * Returns true if this stream was rejected, false otherwise. Use this as 1299 * an aid to distinguish between errors. 1300 */ 1301int 1302lsquic_stream_is_rejected (const lsquic_stream_t *s); 1303 1304/** 1305 * Refuse pushed stream. Call it from @ref on_new_stream. 1306 * 1307 * No need to call lsquic_stream_close() after this. on_close will be called. 1308 * 1309 * @see lsquic_stream_is_pushed 1310 */ 1311int 1312lsquic_stream_refuse_push (lsquic_stream_t *s); 1313 1314/** 1315 * Get information associated with pushed stream: 1316 * 1317 * @param ref_stream_id Stream ID in response to which push promise was 1318 * sent. 1319 * @param hdr_set Header set. This object was passed to or generated 1320 * by @ref lsquic_conn_push_stream(). 1321 * 1322 * @retval 0 Success. 1323 * @retval -1 This is not a pushed stream. 1324 */ 1325int 1326lsquic_stream_push_info (const lsquic_stream_t *, 1327 lsquic_stream_id_t *ref_stream_id, void **hdr_set); 1328 1329/** Return current priority of the stream */ 1330unsigned lsquic_stream_priority (const lsquic_stream_t *s); 1331 1332/** 1333 * Set stream priority. Valid priority values are 1 through 256, inclusive. 1334 * 1335 * @retval 0 Success. 1336 * @retval -1 Priority value is invalid. 1337 */ 1338int lsquic_stream_set_priority (lsquic_stream_t *s, unsigned priority); 1339 1340/** 1341 * Get a pointer to the connection object. Use it with lsquic_conn_* 1342 * functions. 1343 */ 1344lsquic_conn_t * lsquic_stream_conn(const lsquic_stream_t *s); 1345 1346lsquic_stream_t * 1347lsquic_conn_get_stream_by_id (lsquic_conn_t *c, lsquic_stream_id_t stream_id); 1348 1349/** Get connection ID */ 1350const lsquic_cid_t * 1351lsquic_conn_id (const lsquic_conn_t *c); 1352 1353/** Get pointer to the engine */ 1354lsquic_engine_t * 1355lsquic_conn_get_engine (lsquic_conn_t *c); 1356 1357int 1358lsquic_conn_get_sockaddr(lsquic_conn_t *c, 1359 const struct sockaddr **local, const struct sockaddr **peer); 1360 1361struct lsquic_logger_if { 1362 int (*log_buf)(void *logger_ctx, const char *buf, size_t len); 1363}; 1364 1365/** 1366 * Enumerate timestamp styles supported by LSQUIC logger mechanism. 1367 */ 1368enum lsquic_logger_timestamp_style { 1369 /** 1370 * No timestamp is generated. 1371 */ 1372 LLTS_NONE, 1373 1374 /** 1375 * The timestamp consists of 24 hours, minutes, seconds, and 1376 * milliseconds. Example: 13:43:46.671 1377 */ 1378 LLTS_HHMMSSMS, 1379 1380 /** 1381 * Like above, plus date, e.g: 2017-03-21 13:43:46.671 1382 */ 1383 LLTS_YYYYMMDD_HHMMSSMS, 1384 1385 /** 1386 * This is Chrome-like timestamp used by proto-quic. The timestamp 1387 * includes month, date, hours, minutes, seconds, and microseconds. 1388 * 1389 * Example: 1223/104613.946956 (instead of 12/23 10:46:13.946956). 1390 * 1391 * This is to facilitate reading two logs side-by-side. 1392 */ 1393 LLTS_CHROMELIKE, 1394 1395 /** 1396 * The timestamp consists of 24 hours, minutes, seconds, and 1397 * microseconds. Example: 13:43:46.671123 1398 */ 1399 LLTS_HHMMSSUS, 1400 1401 /** 1402 * Date and time using microsecond resolution, 1403 * e.g: 2017-03-21 13:43:46.671123 1404 */ 1405 LLTS_YYYYMMDD_HHMMSSUS, 1406 1407 N_LLTS 1408}; 1409 1410/** 1411 * Call this if you want to do something with LSQUIC log messages, as they 1412 * are thrown out by default. 1413 */ 1414void lsquic_logger_init(const struct lsquic_logger_if *, void *logger_ctx, 1415 enum lsquic_logger_timestamp_style); 1416 1417/** 1418 * Set log level for all LSQUIC modules. Acceptable values are debug, info, 1419 * notice, warning, error, alert, emerg, crit (case-insensitive). 1420 * 1421 * @retval 0 Success. 1422 * @retval -1 Failure: log_level is not valid. 1423 */ 1424int 1425lsquic_set_log_level (const char *log_level); 1426 1427/** 1428 * E.g. "event=debug" 1429 */ 1430int 1431lsquic_logger_lopt (const char *optarg); 1432 1433/** 1434 * Return the list of QUIC versions (as bitmask) this engine instance 1435 * supports. 1436 */ 1437unsigned lsquic_engine_quic_versions (const lsquic_engine_t *); 1438 1439/** 1440 * This is one of the flags that can be passed to @ref lsquic_global_init. 1441 * Use it to initialize LSQUIC for use in client mode. 1442 */ 1443#define LSQUIC_GLOBAL_CLIENT (1 << 0) 1444 1445/** 1446 * This is one of the flags that can be passed to @ref lsquic_global_init. 1447 * Use it to initialize LSQUIC for use in server mode. 1448 */ 1449#define LSQUIC_GLOBAL_SERVER (1 << 1) 1450 1451/** 1452 * Initialize LSQUIC. This must be called before any other LSQUIC function 1453 * is called. Returns 0 on success and -1 on failure. 1454 * 1455 * @param flags This a bitmask of @ref LSQUIC_GLOBAL_CLIENT and 1456 * @ref LSQUIC_GLOBAL_SERVER. At least one of these 1457 * flags should be specified. 1458 * 1459 * @retval 0 Success. 1460 * @retval -1 Initialization failed. 1461 * 1462 * @see LSQUIC_GLOBAL_CLIENT 1463 * @see LSQUIC_GLOBAL_SERVER 1464 */ 1465int 1466lsquic_global_init (int flags); 1467 1468/** 1469 * Clean up global state created by @ref lsquic_global_init. Should be 1470 * called after all LSQUIC engine instances are gone. 1471 */ 1472void 1473lsquic_global_cleanup (void); 1474 1475/** 1476 * Get QUIC version used by the connection. 1477 * 1478 * @see lsquic_version 1479 */ 1480enum lsquic_version 1481lsquic_conn_quic_version (const lsquic_conn_t *c); 1482 1483/* Return keysize or -1 on error */ 1484int 1485lsquic_conn_crypto_keysize (const lsquic_conn_t *c); 1486 1487/* Return algorithm keysize or -1 on error */ 1488int 1489lsquic_conn_crypto_alg_keysize (const lsquic_conn_t *c); 1490 1491enum lsquic_crypto_ver 1492{ 1493 LSQ_CRY_QUIC, 1494 LSQ_CRY_TLSv13, 1495}; 1496 1497enum lsquic_crypto_ver 1498lsquic_conn_crypto_ver (const lsquic_conn_t *c); 1499 1500/* Return cipher or NULL on error */ 1501const char * 1502lsquic_conn_crypto_cipher (const lsquic_conn_t *c); 1503 1504/** Translate string QUIC version to LSQUIC QUIC version representation */ 1505enum lsquic_version 1506lsquic_str2ver (const char *str, size_t len); 1507 1508/** 1509 * This function closes all mini connections and marks all full connection 1510 * as going away. In server mode, this also causes the engine to stop 1511 * creating new connections. 1512 */ 1513void 1514lsquic_engine_cooldown (lsquic_engine_t *); 1515 1516struct ssl_st * 1517lsquic_hsk_getssl(lsquic_conn_t *conn); 1518 1519/** 1520 * Get user-supplied context associated with the connection. 1521 */ 1522lsquic_conn_ctx_t * 1523lsquic_conn_get_ctx (const lsquic_conn_t *); 1524 1525/** 1526 * Set user-supplied context associated with the connection. 1527 */ 1528void 1529lsquic_conn_set_ctx (lsquic_conn_t *, lsquic_conn_ctx_t *); 1530 1531/** 1532 * Get peer context associated with the connection. 1533 */ 1534void * 1535lsquic_conn_get_peer_ctx (lsquic_conn_t *, const struct sockaddr *local_sa); 1536 1537/** 1538 * Abort connection. 1539 */ 1540void 1541lsquic_conn_abort (lsquic_conn_t *); 1542 1543/** 1544 * Helper function: convert list of versions as specified in the argument 1545 * bitmask to string that can be included as argument to "v=" part of the 1546 * Alt-Svc header. 1547 * 1548 * For example (1<<LSQVER_037)|(1<<LSQVER_038) => "37,38" 1549 * 1550 * This is only applicable to Google QUIC versions. 1551 */ 1552const char * 1553lsquic_get_alt_svc_versions (unsigned versions); 1554 1555/** 1556 * Return a NULL-terminated list of HTTP/3 ALPNs, e.g "h3-17", "h3-18", "h3". 1557 */ 1558const char *const * 1559lsquic_get_h3_alpns (unsigned versions); 1560 1561/** 1562 * Returns true if provided buffer could be a valid handshake-stage packet, 1563 * false otherwise. Do not call this function if a connection has already 1564 * been established: it will return incorrect result. 1565 */ 1566int 1567lsquic_is_valid_hs_packet (lsquic_engine_t *, const unsigned char *, size_t); 1568 1569/** 1570 * Parse cid from packet stored in `buf' and store it to `cid'. Returns 0 1571 * on success and -1 on failure. 1572 */ 1573int 1574lsquic_cid_from_packet (const unsigned char *, size_t bufsz, lsquic_cid_t *cid); 1575 1576/** 1577 * Returns true if there are connections to be processed, false otherwise. 1578 * If true, `diff' is set to the difference between the earliest advisory 1579 * tick time and now. If the former is in the past, the value of `diff' 1580 * is negative. 1581 */ 1582int 1583lsquic_engine_earliest_adv_tick (lsquic_engine_t *engine, int *diff); 1584 1585/** 1586 * Return number of connections whose advisory tick time is before current 1587 * time plus `from_now' microseconds from now. `from_now' can be negative. 1588 */ 1589unsigned 1590lsquic_engine_count_attq (lsquic_engine_t *engine, int from_now); 1591 1592enum LSQUIC_CONN_STATUS 1593{ 1594 LSCONN_ST_HSK_IN_PROGRESS, 1595 LSCONN_ST_CONNECTED, 1596 LSCONN_ST_HSK_FAILURE, 1597 LSCONN_ST_GOING_AWAY, 1598 LSCONN_ST_TIMED_OUT, 1599 /* If es_honor_prst is not set, the connection will never get public 1600 * reset packets and this flag will not be set. 1601 */ 1602 LSCONN_ST_RESET, 1603 LSCONN_ST_USER_ABORTED, 1604 LSCONN_ST_ERROR, 1605 LSCONN_ST_CLOSED, 1606 LSCONN_ST_PEER_GOING_AWAY, 1607}; 1608 1609enum LSQUIC_CONN_STATUS 1610lsquic_conn_status (lsquic_conn_t *, char *errbuf, size_t bufsz); 1611 1612extern const char *const 1613lsquic_ver2str[N_LSQVER]; 1614 1615#ifdef __cplusplus 1616} 1617#endif 1618 1619#endif //__LSQUIC_H__ 1620 1621