1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
2461e84d8SAmol Deshpande#ifndef WIN32
350aadb33SDmitri Tikhonov#include <arpa/inet.h>
4461e84d8SAmol Deshpande#else
5461e84d8SAmol Deshpande#include <vc_compat.h>
6461e84d8SAmol Deshpande#endif
750aadb33SDmitri Tikhonov#include <errno.h>
850aadb33SDmitri Tikhonov#include <inttypes.h>
950aadb33SDmitri Tikhonov#include <stdlib.h>
1050aadb33SDmitri Tikhonov#include <string.h>
11461e84d8SAmol Deshpande#include <sys/queue.h>
1250aadb33SDmitri Tikhonov
13b55a5117SDmitri Tikhonov#include <openssl/x509.h>
14b55a5117SDmitri Tikhonov
1550aadb33SDmitri Tikhonov#include "lsquic.h"
1650aadb33SDmitri Tikhonov#include "lsquic_types.h"
1750aadb33SDmitri Tikhonov#include "lsquic_int_types.h"
1850aadb33SDmitri Tikhonov#include "lsquic_packet_common.h"
195392f7a3SLiteSpeed Tech#include "lsquic_packet_gquic.h"
2050aadb33SDmitri Tikhonov#include "lsquic_packet_in.h"
2150aadb33SDmitri Tikhonov#include "lsquic_packet_out.h"
2250aadb33SDmitri Tikhonov#include "lsquic_parse.h"
2350aadb33SDmitri Tikhonov#include "lsquic_frame_common.h"
243b55e6aeSDmitri Tikhonov#include "lsquic_headers.h"
259626cfc2SDmitri Tikhonov#include "lsquic_str.h"
265392f7a3SLiteSpeed Tech#include "lsquic_frame_reader.h"
275392f7a3SLiteSpeed Tech#include "lsquic_enc_sess.h"
2850aadb33SDmitri Tikhonov#include "lsquic_ev_log.h"
295392f7a3SLiteSpeed Tech#include "lsquic_sizes.h"
305392f7a3SLiteSpeed Tech#include "lsquic_trans_params.h"
315392f7a3SLiteSpeed Tech#include "lsquic_util.h"
325392f7a3SLiteSpeed Tech#include "lsquic_hash.h"
335392f7a3SLiteSpeed Tech#include "lsquic_conn.h"
3455613f44SDmitri Tikhonov#include "lsxpack_header.h"
3550aadb33SDmitri Tikhonov
3650aadb33SDmitri Tikhonov#define LSQUIC_LOGGER_MODULE LSQLM_EVENT
3750aadb33SDmitri Tikhonov#include "lsquic_logger.h"
3850aadb33SDmitri Tikhonov
3950aadb33SDmitri Tikhonov
4050aadb33SDmitri Tikhonov/*  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  */
4150aadb33SDmitri Tikhonov/*  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  */
4250aadb33SDmitri Tikhonov/* Messages that do not include connection ID go above this point */
4350aadb33SDmitri Tikhonov
4450aadb33SDmitri Tikhonov#define LSQUIC_LOG_CONN_ID cid
45461e84d8SAmol Deshpande#define LCID(...) LSQ_LOG2(LSQ_LOG_DEBUG, __VA_ARGS__)   /* LCID: log with CID */
4650aadb33SDmitri Tikhonov
4750aadb33SDmitri Tikhonov/* Messages that are to include connection ID go below this point */
4850aadb33SDmitri Tikhonov/*  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  */
4950aadb33SDmitri Tikhonov/*  VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV  */
5050aadb33SDmitri Tikhonov
5150aadb33SDmitri Tikhonovvoid
525392f7a3SLiteSpeed Techlsquic_ev_log_packet_in (const lsquic_cid_t *cid,
535392f7a3SLiteSpeed Tech                                        const lsquic_packet_in_t *packet_in)
5450aadb33SDmitri Tikhonov{
55bbee242aSDmitri Tikhonov    unsigned packet_sz;
56bbee242aSDmitri Tikhonov
57bbee242aSDmitri Tikhonov    switch (packet_in->pi_flags & (PI_FROM_MINI|PI_GQUIC))
589626cfc2SDmitri Tikhonov    {
595392f7a3SLiteSpeed Tech    case PI_FROM_MINI|PI_GQUIC:
605392f7a3SLiteSpeed Tech        LCID("packet in: %"PRIu64" (from mini)", packet_in->pi_packno);
615392f7a3SLiteSpeed Tech        break;
625392f7a3SLiteSpeed Tech    case PI_FROM_MINI:
635392f7a3SLiteSpeed Tech        LCID("packet in: %"PRIu64" (from mini), type: %s, ecn: %u",
645392f7a3SLiteSpeed Tech            packet_in->pi_packno, lsquic_hety2str[packet_in->pi_header_type],
655392f7a3SLiteSpeed Tech            lsquic_packet_in_ecn(packet_in));
665392f7a3SLiteSpeed Tech        break;
679626cfc2SDmitri Tikhonov    case PI_GQUIC:
68bbee242aSDmitri Tikhonov        packet_sz = packet_in->pi_data_sz
69bbee242aSDmitri Tikhonov            + (packet_in->pi_flags & PI_DECRYPTED ? GQUIC_PACKET_HASH_SZ : 0);
70bbee242aSDmitri Tikhonov        LCID("packet in: %"PRIu64", size: %u", packet_in->pi_packno, packet_sz);
719626cfc2SDmitri Tikhonov        break;
729626cfc2SDmitri Tikhonov    default:
73bbee242aSDmitri Tikhonov        packet_sz = packet_in->pi_data_sz
74bbee242aSDmitri Tikhonov            + (packet_in->pi_flags & PI_DECRYPTED ? IQUIC_TAG_LEN : 0);
7502b6086dSDmitri Tikhonov        if (packet_in->pi_flags & PI_LOG_QL_BITS)
7602b6086dSDmitri Tikhonov            LCID("packet in: %"PRIu64", type: %s, size: %u; ecn: %u, spin: %d; "
7702b6086dSDmitri Tikhonov                "path: %hhu; Q: %d; L: %d",
7802b6086dSDmitri Tikhonov                packet_in->pi_packno, lsquic_hety2str[packet_in->pi_header_type],
79bbee242aSDmitri Tikhonov                packet_sz,
8002b6086dSDmitri Tikhonov                lsquic_packet_in_ecn(packet_in),
8102b6086dSDmitri Tikhonov                /* spin bit value is only valid for short packet headers */
8202b6086dSDmitri Tikhonov                lsquic_packet_in_spin_bit(packet_in), packet_in->pi_path_id,
8302b6086dSDmitri Tikhonov                ((packet_in->pi_flags & PI_SQUARE_BIT) > 0),
8402b6086dSDmitri Tikhonov                ((packet_in->pi_flags & PI_LOSS_BIT) > 0));
8502b6086dSDmitri Tikhonov        else
8602b6086dSDmitri Tikhonov            LCID("packet in: %"PRIu64", type: %s, size: %u; ecn: %u, spin: %d; "
8702b6086dSDmitri Tikhonov                "path: %hhu",
8802b6086dSDmitri Tikhonov                packet_in->pi_packno, lsquic_hety2str[packet_in->pi_header_type],
89bbee242aSDmitri Tikhonov                packet_sz,
9002b6086dSDmitri Tikhonov                lsquic_packet_in_ecn(packet_in),
9102b6086dSDmitri Tikhonov                /* spin bit value is only valid for short packet headers */
9202b6086dSDmitri Tikhonov                lsquic_packet_in_spin_bit(packet_in), packet_in->pi_path_id);
939626cfc2SDmitri Tikhonov        break;
949626cfc2SDmitri Tikhonov    }
9550aadb33SDmitri Tikhonov}
9650aadb33SDmitri Tikhonov
9750aadb33SDmitri Tikhonov
9850aadb33SDmitri Tikhonovvoid
995392f7a3SLiteSpeed Techlsquic_ev_log_ack_frame_in (const lsquic_cid_t *cid,
1005392f7a3SLiteSpeed Tech                                        const struct ack_info *acki)
10150aadb33SDmitri Tikhonov{
102de46bf2fSDmitri Tikhonov    char buf[MAX_ACKI_STR_SZ];
10350aadb33SDmitri Tikhonov
104de46bf2fSDmitri Tikhonov    lsquic_acki2str(acki, buf, sizeof(buf));
105de46bf2fSDmitri Tikhonov    LCID("ACK frame in: %s", buf);
10650aadb33SDmitri Tikhonov}
10750aadb33SDmitri Tikhonov
10850aadb33SDmitri Tikhonov
10950aadb33SDmitri Tikhonovvoid
1105392f7a3SLiteSpeed Techlsquic_ev_log_stream_frame_in (const lsquic_cid_t *cid,
11150aadb33SDmitri Tikhonov                                        const struct stream_frame *frame)
11250aadb33SDmitri Tikhonov{
1135392f7a3SLiteSpeed Tech    LCID("STREAM frame in: stream %"PRIu64"; offset %"PRIu64"; size %"PRIu16
11450aadb33SDmitri Tikhonov        "; fin: %d", frame->stream_id, frame->data_frame.df_offset,
11550aadb33SDmitri Tikhonov        frame->data_frame.df_size, (int) frame->data_frame.df_fin);
11650aadb33SDmitri Tikhonov}
11750aadb33SDmitri Tikhonov
11850aadb33SDmitri Tikhonov
11950aadb33SDmitri Tikhonovvoid
1205392f7a3SLiteSpeed Techlsquic_ev_log_crypto_frame_in (const lsquic_cid_t *cid,
1215392f7a3SLiteSpeed Tech                        const struct stream_frame *frame, unsigned enc_level)
1225392f7a3SLiteSpeed Tech{
1235392f7a3SLiteSpeed Tech    LCID("CRYPTO frame in: level %u; offset %"PRIu64"; size %"PRIu16,
1245392f7a3SLiteSpeed Tech        enc_level, frame->data_frame.df_offset, frame->data_frame.df_size);
1255392f7a3SLiteSpeed Tech}
1265392f7a3SLiteSpeed Tech
1275392f7a3SLiteSpeed Tech
1285392f7a3SLiteSpeed Techvoid
1295392f7a3SLiteSpeed Techlsquic_ev_log_stop_waiting_frame_in (const lsquic_cid_t *cid,
1305392f7a3SLiteSpeed Tech                                                        lsquic_packno_t least)
13150aadb33SDmitri Tikhonov{
13250aadb33SDmitri Tikhonov    LCID("STOP_WAITING frame in: least unacked packno %"PRIu64, least);
13350aadb33SDmitri Tikhonov}
13450aadb33SDmitri Tikhonov
13550aadb33SDmitri Tikhonov
13650aadb33SDmitri Tikhonovvoid
1375392f7a3SLiteSpeed Techlsquic_ev_log_window_update_frame_in (const lsquic_cid_t *cid,
1385392f7a3SLiteSpeed Tech                                lsquic_stream_id_t stream_id, uint64_t offset)
13950aadb33SDmitri Tikhonov{
1405392f7a3SLiteSpeed Tech    LCID("WINDOW_UPDATE frame in: stream %"PRIu64"; offset %"PRIu64,
14150aadb33SDmitri Tikhonov        stream_id, offset);
14250aadb33SDmitri Tikhonov}
14350aadb33SDmitri Tikhonov
14450aadb33SDmitri Tikhonov
14550aadb33SDmitri Tikhonovvoid
1465392f7a3SLiteSpeed Techlsquic_ev_log_blocked_frame_in (const lsquic_cid_t *cid,
1475392f7a3SLiteSpeed Tech                                            lsquic_stream_id_t stream_id)
14850aadb33SDmitri Tikhonov{
1495392f7a3SLiteSpeed Tech    LCID("BLOCKED frame in: stream %"PRIu64, stream_id);
15050aadb33SDmitri Tikhonov}
15150aadb33SDmitri Tikhonov
15250aadb33SDmitri Tikhonov
15350aadb33SDmitri Tikhonovvoid
1545392f7a3SLiteSpeed Techlsquic_ev_log_connection_close_frame_in (const lsquic_cid_t *cid,
1555392f7a3SLiteSpeed Tech                    uint64_t error_code, int reason_len, const char *reason)
15650aadb33SDmitri Tikhonov{
1575392f7a3SLiteSpeed Tech    LCID("CONNECTION_CLOSE frame in: error code %"PRIu64", reason: %.*s",
15850aadb33SDmitri Tikhonov        error_code, reason_len, reason);
15950aadb33SDmitri Tikhonov}
16050aadb33SDmitri Tikhonov
16150aadb33SDmitri Tikhonov
16250aadb33SDmitri Tikhonovvoid
1635392f7a3SLiteSpeed Techlsquic_ev_log_goaway_frame_in (const lsquic_cid_t *cid, uint32_t error_code,
1645392f7a3SLiteSpeed Tech            lsquic_stream_id_t stream_id, int reason_len, const char *reason)
16550aadb33SDmitri Tikhonov{
1665392f7a3SLiteSpeed Tech    LCID("GOAWAY frame in: error code %"PRIu32", stream %"PRIu64
16750aadb33SDmitri Tikhonov        ", reason: %.*s", error_code, stream_id, reason_len, reason);
16850aadb33SDmitri Tikhonov}
16950aadb33SDmitri Tikhonov
17050aadb33SDmitri Tikhonov
17150aadb33SDmitri Tikhonovvoid
1725392f7a3SLiteSpeed Techlsquic_ev_log_rst_stream_frame_in (const lsquic_cid_t *cid,
1735392f7a3SLiteSpeed Tech        lsquic_stream_id_t stream_id, uint64_t offset, uint64_t error_code)
17450aadb33SDmitri Tikhonov{
1755392f7a3SLiteSpeed Tech    LCID("RST_STREAM frame in: error code %"PRIu64", stream %"PRIu64
17650aadb33SDmitri Tikhonov        ", offset: %"PRIu64, error_code, stream_id, offset);
17750aadb33SDmitri Tikhonov}
17850aadb33SDmitri Tikhonov
17950aadb33SDmitri Tikhonov
18050aadb33SDmitri Tikhonovvoid
1815392f7a3SLiteSpeed Techlsquic_ev_log_stop_sending_frame_in (const lsquic_cid_t *cid,
1825392f7a3SLiteSpeed Tech                        lsquic_stream_id_t stream_id, uint64_t error_code)
1835392f7a3SLiteSpeed Tech{
1845392f7a3SLiteSpeed Tech    LCID("STOP_SENDING frame in: error code %"PRIu64", stream %"PRIu64,
1855392f7a3SLiteSpeed Tech                                                     error_code, stream_id);
1865392f7a3SLiteSpeed Tech}
1875392f7a3SLiteSpeed Tech
1885392f7a3SLiteSpeed Tech
1895392f7a3SLiteSpeed Techvoid
1905392f7a3SLiteSpeed Techlsquic_ev_log_padding_frame_in (const lsquic_cid_t *cid, size_t len)
19150aadb33SDmitri Tikhonov{
19250aadb33SDmitri Tikhonov    LCID("PADDING frame in of %zd bytes", len);
19350aadb33SDmitri Tikhonov}
19450aadb33SDmitri Tikhonov
19550aadb33SDmitri Tikhonov
19650aadb33SDmitri Tikhonovvoid
1975392f7a3SLiteSpeed Techlsquic_ev_log_ping_frame_in (const lsquic_cid_t *cid)
19850aadb33SDmitri Tikhonov{
19950aadb33SDmitri Tikhonov    LCID("PING frame in");
20050aadb33SDmitri Tikhonov}
20150aadb33SDmitri Tikhonov
20250aadb33SDmitri Tikhonov
20350aadb33SDmitri Tikhonovvoid
2045392f7a3SLiteSpeed Techlsquic_ev_log_packet_created (const lsquic_cid_t *cid,
20550aadb33SDmitri Tikhonov                                const struct lsquic_packet_out *packet_out)
20650aadb33SDmitri Tikhonov{
20750aadb33SDmitri Tikhonov    LCID("created packet %"PRIu64"; flags: version=%d, nonce=%d, conn_id=%d",
20850aadb33SDmitri Tikhonov        packet_out->po_packno,
20950aadb33SDmitri Tikhonov        !!(packet_out->po_flags & PO_VERSION),
21050aadb33SDmitri Tikhonov        !!(packet_out->po_flags & PO_NONCE),
21150aadb33SDmitri Tikhonov        !!(packet_out->po_flags & PO_CONN_ID));
21250aadb33SDmitri Tikhonov}
21350aadb33SDmitri Tikhonov
21450aadb33SDmitri Tikhonov
21550aadb33SDmitri Tikhonovvoid
2165392f7a3SLiteSpeed Techlsquic_ev_log_packet_sent (const lsquic_cid_t *cid,
21750aadb33SDmitri Tikhonov                                const struct lsquic_packet_out *packet_out)
21850aadb33SDmitri Tikhonov{
21950aadb33SDmitri Tikhonov    char frames[lsquic_frame_types_str_sz];
22050aadb33SDmitri Tikhonov    if (lsquic_packet_out_verneg(packet_out))
22150aadb33SDmitri Tikhonov        LCID("sent version negotiation packet, size %hu",
22250aadb33SDmitri Tikhonov                                                    packet_out->po_data_sz);
2235392f7a3SLiteSpeed Tech    else if (lsquic_packet_out_retry(packet_out))
2245392f7a3SLiteSpeed Tech        LCID("sent stateless retry packet, size %hu", packet_out->po_data_sz);
22550aadb33SDmitri Tikhonov    else if (lsquic_packet_out_pubres(packet_out))
22650aadb33SDmitri Tikhonov        LCID("sent public reset packet, size %hu", packet_out->po_data_sz);
2275392f7a3SLiteSpeed Tech    else if (packet_out->po_lflags & POL_GQUIC)
22850aadb33SDmitri Tikhonov        LCID("sent packet %"PRIu64", size %hu, frame types: %s",
22950aadb33SDmitri Tikhonov            packet_out->po_packno, packet_out->po_enc_data_sz,
23050aadb33SDmitri Tikhonov                /* Frame types is a list of different frames types contained
23150aadb33SDmitri Tikhonov                 * in the packet, no more.  Count and order of frames is not
23250aadb33SDmitri Tikhonov                 * printed.
23350aadb33SDmitri Tikhonov                 */
23450aadb33SDmitri Tikhonov                lsquic_frame_types_to_str(frames, sizeof(frames),
23550aadb33SDmitri Tikhonov                                                packet_out->po_frame_types));
23602b6086dSDmitri Tikhonov    else if (packet_out->po_lflags & POL_LOG_QL_BITS)
23702b6086dSDmitri Tikhonov        LCID("sent packet %"PRIu64", type %s, crypto: %s, size %hu, frame "
23802b6086dSDmitri Tikhonov            "types: %s, ecn: %u, spin: %d; kp: %u, path: %hhu, flags: %u; "
23902b6086dSDmitri Tikhonov            "Q: %u; L: %u",
24002b6086dSDmitri Tikhonov            packet_out->po_packno, lsquic_hety2str[packet_out->po_header_type],
24102b6086dSDmitri Tikhonov            lsquic_enclev2str[ lsquic_packet_out_enc_level(packet_out) ],
24202b6086dSDmitri Tikhonov            packet_out->po_enc_data_sz,
24302b6086dSDmitri Tikhonov                /* Frame types is a list of different frames types contained
24402b6086dSDmitri Tikhonov                 * in the packet, no more.  Count and order of frames is not
24502b6086dSDmitri Tikhonov                 * printed.
24602b6086dSDmitri Tikhonov                 */
24702b6086dSDmitri Tikhonov                lsquic_frame_types_to_str(frames, sizeof(frames),
24802b6086dSDmitri Tikhonov                                                packet_out->po_frame_types),
24902b6086dSDmitri Tikhonov                lsquic_packet_out_ecn(packet_out),
25002b6086dSDmitri Tikhonov                /* spin bit value is only valid for short packet headers */
25102b6086dSDmitri Tikhonov                lsquic_packet_out_spin_bit(packet_out),
25202b6086dSDmitri Tikhonov                lsquic_packet_out_kp(packet_out),
25302b6086dSDmitri Tikhonov                packet_out->po_path->np_path_id,
25402b6086dSDmitri Tikhonov                (unsigned) packet_out->po_flags,
25502b6086dSDmitri Tikhonov                lsquic_packet_out_square_bit(packet_out),
25602b6086dSDmitri Tikhonov                lsquic_packet_out_loss_bit(packet_out));
2579626cfc2SDmitri Tikhonov    else
2589626cfc2SDmitri Tikhonov        LCID("sent packet %"PRIu64", type %s, crypto: %s, size %hu, frame "
25984dbbb75SDmitri Tikhonov            "types: %s, ecn: %u, spin: %d; kp: %u, path: %hhu, flags: %u",
2609626cfc2SDmitri Tikhonov            packet_out->po_packno, lsquic_hety2str[packet_out->po_header_type],
2619626cfc2SDmitri Tikhonov            lsquic_enclev2str[ lsquic_packet_out_enc_level(packet_out) ],
2629626cfc2SDmitri Tikhonov            packet_out->po_enc_data_sz,
2639626cfc2SDmitri Tikhonov                /* Frame types is a list of different frames types contained
2649626cfc2SDmitri Tikhonov                 * in the packet, no more.  Count and order of frames is not
2659626cfc2SDmitri Tikhonov                 * printed.
2669626cfc2SDmitri Tikhonov                 */
2679626cfc2SDmitri Tikhonov                lsquic_frame_types_to_str(frames, sizeof(frames),
2685392f7a3SLiteSpeed Tech                                                packet_out->po_frame_types),
2695392f7a3SLiteSpeed Tech                lsquic_packet_out_ecn(packet_out),
2705392f7a3SLiteSpeed Tech                /* spin bit value is only valid for short packet headers */
2715392f7a3SLiteSpeed Tech                lsquic_packet_out_spin_bit(packet_out),
2725392f7a3SLiteSpeed Tech                lsquic_packet_out_kp(packet_out),
27384dbbb75SDmitri Tikhonov                packet_out->po_path->np_path_id,
27484dbbb75SDmitri Tikhonov                (unsigned) packet_out->po_flags);
27550aadb33SDmitri Tikhonov}
27650aadb33SDmitri Tikhonov
27750aadb33SDmitri Tikhonov
27850aadb33SDmitri Tikhonovvoid
2795392f7a3SLiteSpeed Techlsquic_ev_log_packet_not_sent (const lsquic_cid_t *cid,
28050aadb33SDmitri Tikhonov                                const struct lsquic_packet_out *packet_out)
28150aadb33SDmitri Tikhonov{
28250aadb33SDmitri Tikhonov    char frames[lsquic_frame_types_str_sz];
28350aadb33SDmitri Tikhonov    LCID("unsent packet %"PRIu64", size %hu, frame types: %s",
28450aadb33SDmitri Tikhonov        packet_out->po_packno, packet_out->po_enc_data_sz,
28550aadb33SDmitri Tikhonov            /* Frame types is a list of different frames types contained in
28650aadb33SDmitri Tikhonov             * the packet, no more.  Count and order of frames is not printed.
28750aadb33SDmitri Tikhonov             */
28850aadb33SDmitri Tikhonov            lsquic_frame_types_to_str(frames, sizeof(frames),
28950aadb33SDmitri Tikhonov                                                packet_out->po_frame_types));
29050aadb33SDmitri Tikhonov}
29150aadb33SDmitri Tikhonov
29250aadb33SDmitri Tikhonov
29350aadb33SDmitri Tikhonovvoid
2945392f7a3SLiteSpeed Techlsquic_ev_log_http_headers_in (const lsquic_cid_t *cid, int is_server,
29550aadb33SDmitri Tikhonov                                        const struct uncompressed_headers *uh)
29650aadb33SDmitri Tikhonov{
2973b55e6aeSDmitri Tikhonov    const struct http1x_headers *h1h;
29850aadb33SDmitri Tikhonov    const char *cr, *p;
29950aadb33SDmitri Tikhonov
30050aadb33SDmitri Tikhonov    if (uh->uh_flags & UH_PP)
3015392f7a3SLiteSpeed Tech        LCID("read push promise; stream %"PRIu64", promised stream %"PRIu64,
30250aadb33SDmitri Tikhonov            uh->uh_stream_id, uh->uh_oth_stream_id);
30350aadb33SDmitri Tikhonov    else
3045392f7a3SLiteSpeed Tech        LCID("read %s headers; stream: %"PRIu64", depends on stream: %"PRIu64
30550aadb33SDmitri Tikhonov            ", weight: %hu, exclusive: %d, fin: %d",
30650aadb33SDmitri Tikhonov            is_server ? "request" : "response",
30750aadb33SDmitri Tikhonov            uh->uh_stream_id, uh->uh_oth_stream_id, uh->uh_weight,
30850aadb33SDmitri Tikhonov            (int) uh->uh_exclusive, !!(uh->uh_flags & UH_FIN));
30950aadb33SDmitri Tikhonov
3103b55e6aeSDmitri Tikhonov    if (uh->uh_flags & UH_H1H)
31150aadb33SDmitri Tikhonov    {
3123b55e6aeSDmitri Tikhonov        h1h = uh->uh_hset;
3133b55e6aeSDmitri Tikhonov        for (p = h1h->h1h_buf; p < h1h->h1h_buf + h1h->h1h_size; p = cr + 2)
3143b55e6aeSDmitri Tikhonov        {
3153b55e6aeSDmitri Tikhonov            cr = strchr(p, '\r');
3163b55e6aeSDmitri Tikhonov            if (cr && cr > p)
3173b55e6aeSDmitri Tikhonov                LCID("  %.*s", (int) (cr - p), p);
3183b55e6aeSDmitri Tikhonov            else
3193b55e6aeSDmitri Tikhonov                break;
3203b55e6aeSDmitri Tikhonov        }
32150aadb33SDmitri Tikhonov    }
32250aadb33SDmitri Tikhonov}
32350aadb33SDmitri Tikhonov
32450aadb33SDmitri Tikhonov
32550aadb33SDmitri Tikhonovvoid
3265392f7a3SLiteSpeed Techlsquic_ev_log_action_stream_frame (const lsquic_cid_t *cid,
327c51ce338SDmitri Tikhonov    const struct parse_funcs *pf, const unsigned char *buf, size_t bufsz,
328c51ce338SDmitri Tikhonov    const char *what)
32950aadb33SDmitri Tikhonov{
33050aadb33SDmitri Tikhonov    struct stream_frame frame;
33150aadb33SDmitri Tikhonov    int len;
33250aadb33SDmitri Tikhonov
33350aadb33SDmitri Tikhonov    len = pf->pf_parse_stream_frame(buf, bufsz, &frame);
33450aadb33SDmitri Tikhonov    if (len > 0)
3355392f7a3SLiteSpeed Tech        LCID("%s STREAM frame: stream %"PRIu64", offset: %"PRIu64
336c51ce338SDmitri Tikhonov            ", size: %"PRIu16", fin: %d", what, frame.stream_id,
33750aadb33SDmitri Tikhonov            frame.data_frame.df_offset, frame.data_frame.df_size,
33850aadb33SDmitri Tikhonov            frame.data_frame.df_fin);
33950aadb33SDmitri Tikhonov    else
34050aadb33SDmitri Tikhonov        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse STREAM frame");
34150aadb33SDmitri Tikhonov}
34250aadb33SDmitri Tikhonov
34350aadb33SDmitri Tikhonov
34450aadb33SDmitri Tikhonovvoid
3455392f7a3SLiteSpeed Techlsquic_ev_log_generated_crypto_frame (const lsquic_cid_t *cid,
3465392f7a3SLiteSpeed Tech       const struct parse_funcs *pf, const unsigned char *buf, size_t bufsz)
3475392f7a3SLiteSpeed Tech{
3485392f7a3SLiteSpeed Tech    struct stream_frame frame;
3495392f7a3SLiteSpeed Tech    int len;
3505392f7a3SLiteSpeed Tech
3515392f7a3SLiteSpeed Tech    len = pf->pf_parse_crypto_frame(buf, bufsz, &frame);
3525392f7a3SLiteSpeed Tech    if (len > 0)
3535392f7a3SLiteSpeed Tech        LCID("generated CRYPTO frame: offset: %"PRIu64", size: %"PRIu16,
3545392f7a3SLiteSpeed Tech            frame.data_frame.df_offset, frame.data_frame.df_size);
3555392f7a3SLiteSpeed Tech    else
3565392f7a3SLiteSpeed Tech        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse CRYPTO frame");
3575392f7a3SLiteSpeed Tech}
3585392f7a3SLiteSpeed Tech
3595392f7a3SLiteSpeed Tech
3605392f7a3SLiteSpeed Techvoid
3615392f7a3SLiteSpeed Techlsquic_ev_log_generated_ack_frame (const lsquic_cid_t *cid,
3625392f7a3SLiteSpeed Tech                const struct parse_funcs *pf, const unsigned char *ack_buf,
3635392f7a3SLiteSpeed Tech                size_t ack_buf_sz)
36450aadb33SDmitri Tikhonov{
36550aadb33SDmitri Tikhonov    struct ack_info acki;
36650aadb33SDmitri Tikhonov    int len;
367de46bf2fSDmitri Tikhonov    char buf[MAX_ACKI_STR_SZ];
36850aadb33SDmitri Tikhonov
3695392f7a3SLiteSpeed Tech    len = pf->pf_parse_ack_frame(ack_buf, ack_buf_sz, &acki,
3705392f7a3SLiteSpeed Tech                                                    TP_DEF_ACK_DELAY_EXP);
37150aadb33SDmitri Tikhonov    if (len < 0)
37250aadb33SDmitri Tikhonov    {
37350aadb33SDmitri Tikhonov        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse ACK frame");
37450aadb33SDmitri Tikhonov        return;
37550aadb33SDmitri Tikhonov    }
37650aadb33SDmitri Tikhonov
377de46bf2fSDmitri Tikhonov    lsquic_acki2str(&acki, buf, sizeof(buf));
378de46bf2fSDmitri Tikhonov    LCID("generated ACK frame: %s", buf);
37950aadb33SDmitri Tikhonov}
38050aadb33SDmitri Tikhonov
38150aadb33SDmitri Tikhonov
38250aadb33SDmitri Tikhonovvoid
3835392f7a3SLiteSpeed Techlsquic_ev_log_generated_new_token_frame (const lsquic_cid_t *cid,
3845392f7a3SLiteSpeed Tech                const struct parse_funcs *pf, const unsigned char *frame_buf,
3855392f7a3SLiteSpeed Tech                size_t frame_buf_sz)
3865392f7a3SLiteSpeed Tech{
3875392f7a3SLiteSpeed Tech    const unsigned char *token;
3885392f7a3SLiteSpeed Tech    size_t sz;
3895392f7a3SLiteSpeed Tech    char *buf;
3905392f7a3SLiteSpeed Tech    int len;
3915392f7a3SLiteSpeed Tech
3925392f7a3SLiteSpeed Tech    len = pf->pf_parse_new_token_frame(frame_buf, frame_buf_sz, &token, &sz);
3935392f7a3SLiteSpeed Tech    if (len < 0)
3945392f7a3SLiteSpeed Tech    {
3955392f7a3SLiteSpeed Tech        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse NEW_TOKEN frame");
3965392f7a3SLiteSpeed Tech        return;
3975392f7a3SLiteSpeed Tech    }
3985392f7a3SLiteSpeed Tech
3995392f7a3SLiteSpeed Tech    buf = malloc(sz * 2 + 1);
4005392f7a3SLiteSpeed Tech    if (buf)
4015392f7a3SLiteSpeed Tech    {
4025392f7a3SLiteSpeed Tech        lsquic_hexstr(token, sz, buf, sz * 2 + 1);
4035392f7a3SLiteSpeed Tech        LCID("generated NEW_TOKEN frame: %s", buf);
4045392f7a3SLiteSpeed Tech        free(buf);
4055392f7a3SLiteSpeed Tech    }
4065392f7a3SLiteSpeed Tech}
4075392f7a3SLiteSpeed Tech
4085392f7a3SLiteSpeed Tech
4095392f7a3SLiteSpeed Techvoid
4105392f7a3SLiteSpeed Techlsquic_ev_log_generated_path_chal_frame (const lsquic_cid_t *cid,
4115392f7a3SLiteSpeed Tech                const struct parse_funcs *pf, const unsigned char *frame_buf,
4125392f7a3SLiteSpeed Tech                size_t frame_buf_sz)
4135392f7a3SLiteSpeed Tech{
4145392f7a3SLiteSpeed Tech    uint64_t chal;
4155392f7a3SLiteSpeed Tech    int len;
4165392f7a3SLiteSpeed Tech    char hexbuf[sizeof(chal) * 2 + 1];
4175392f7a3SLiteSpeed Tech
4185392f7a3SLiteSpeed Tech    len = pf->pf_parse_path_chal_frame(frame_buf, frame_buf_sz, &chal);
4195392f7a3SLiteSpeed Tech    if (len > 0)
4205392f7a3SLiteSpeed Tech        LCID("generated PATH_CHALLENGE(%s) frame",
4215392f7a3SLiteSpeed Tech                        HEXSTR((unsigned char *) &chal, sizeof(chal), hexbuf));
4225392f7a3SLiteSpeed Tech    else
4235392f7a3SLiteSpeed Tech        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse PATH_CHALLENGE frame");
4245392f7a3SLiteSpeed Tech}
4255392f7a3SLiteSpeed Tech
4265392f7a3SLiteSpeed Tech
4275392f7a3SLiteSpeed Techvoid
4285392f7a3SLiteSpeed Techlsquic_ev_log_generated_path_resp_frame (const lsquic_cid_t *cid,
4295392f7a3SLiteSpeed Tech                const struct parse_funcs *pf, const unsigned char *frame_buf,
4305392f7a3SLiteSpeed Tech                size_t frame_buf_sz)
4315392f7a3SLiteSpeed Tech{
4325392f7a3SLiteSpeed Tech    uint64_t resp;
4335392f7a3SLiteSpeed Tech    int len;
4345392f7a3SLiteSpeed Tech    char hexbuf[sizeof(resp) * 2 + 1];
4355392f7a3SLiteSpeed Tech
4365392f7a3SLiteSpeed Tech    len = pf->pf_parse_path_resp_frame(frame_buf, frame_buf_sz, &resp);
4375392f7a3SLiteSpeed Tech    if (len > 0)
4385392f7a3SLiteSpeed Tech        LCID("generated PATH_RESPONSE(%s) frame",
4395392f7a3SLiteSpeed Tech                        HEXSTR((unsigned char *) &resp, sizeof(resp), hexbuf));
4405392f7a3SLiteSpeed Tech    else
4415392f7a3SLiteSpeed Tech        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse PATH_RESPONSE frame");
4425392f7a3SLiteSpeed Tech}
4435392f7a3SLiteSpeed Tech
4445392f7a3SLiteSpeed Tech
4455392f7a3SLiteSpeed Techvoid
4465392f7a3SLiteSpeed Techlsquic_ev_log_generated_new_connection_id_frame (const lsquic_cid_t *cid,
4475392f7a3SLiteSpeed Tech                const struct parse_funcs *pf, const unsigned char *frame_buf,
4485392f7a3SLiteSpeed Tech                size_t frame_buf_sz)
4495392f7a3SLiteSpeed Tech{
4505392f7a3SLiteSpeed Tech    const unsigned char *token;
4515392f7a3SLiteSpeed Tech    lsquic_cid_t new_cid;
4525392f7a3SLiteSpeed Tech    uint64_t seqno, retire_prior_to;
4535392f7a3SLiteSpeed Tech    int len;
4545392f7a3SLiteSpeed Tech    char token_buf[IQUIC_SRESET_TOKEN_SZ * 2 + 1];
4555392f7a3SLiteSpeed Tech    char cid_buf[MAX_CID_LEN * 2 + 1];
4565392f7a3SLiteSpeed Tech
4575392f7a3SLiteSpeed Tech    len = pf->pf_parse_new_conn_id(frame_buf, frame_buf_sz, &seqno,
4585392f7a3SLiteSpeed Tech                                        &retire_prior_to, &new_cid, &token);
4595392f7a3SLiteSpeed Tech    if (len < 0)
4605392f7a3SLiteSpeed Tech    {
4615392f7a3SLiteSpeed Tech        LSQ_LOG2(LSQ_LOG_WARN, "cannot parse NEW_CONNECTION_ID frame");
4625392f7a3SLiteSpeed Tech        return;
4635392f7a3SLiteSpeed Tech    }
4645392f7a3SLiteSpeed Tech
4655392f7a3SLiteSpeed Tech    lsquic_hexstr(new_cid.idbuf, new_cid.len, cid_buf, sizeof(cid_buf));
4665392f7a3SLiteSpeed Tech    lsquic_hexstr(token, IQUIC_SRESET_TOKEN_SZ, token_buf, sizeof(token_buf));
4675392f7a3SLiteSpeed Tech    LCID("generated NEW_CONNECTION_ID frame: seqno: %"PRIu64"; retire prior "
4685392f7a3SLiteSpeed Tech        "to: %"PRIu64"; cid: %s; token: %s", seqno, retire_prior_to,
4695392f7a3SLiteSpeed Tech        cid_buf, token_buf);
4705392f7a3SLiteSpeed Tech}
4715392f7a3SLiteSpeed Tech
4725392f7a3SLiteSpeed Tech
4735392f7a3SLiteSpeed Techvoid
4745392f7a3SLiteSpeed Techlsquic_ev_log_generated_stop_waiting_frame (const lsquic_cid_t *cid,
47550aadb33SDmitri Tikhonov                                            lsquic_packno_t lunack)
47650aadb33SDmitri Tikhonov{
47750aadb33SDmitri Tikhonov    LCID("generated STOP_WAITING frame; least unacked: %"PRIu64, lunack);
47850aadb33SDmitri Tikhonov}
47950aadb33SDmitri Tikhonov
48050aadb33SDmitri Tikhonov
48150aadb33SDmitri Tikhonovvoid
4825392f7a3SLiteSpeed Techlsquic_ev_log_generated_stop_sending_frame (const lsquic_cid_t *cid,
4835392f7a3SLiteSpeed Tech                            lsquic_stream_id_t stream_id, uint16_t error_code)
4845392f7a3SLiteSpeed Tech{
4855392f7a3SLiteSpeed Tech    LCID("generated STOP_SENDING frame; stream ID: %"PRIu64"; error code: "
4865392f7a3SLiteSpeed Tech                                            "%"PRIu16, stream_id, error_code);
4875392f7a3SLiteSpeed Tech}
4885392f7a3SLiteSpeed Tech
4895392f7a3SLiteSpeed Tech
4905392f7a3SLiteSpeed Techvoid
4915392f7a3SLiteSpeed Techlsquic_ev_log_generated_http_headers (const lsquic_cid_t *cid,
4925392f7a3SLiteSpeed Tech                    lsquic_stream_id_t stream_id,
49350aadb33SDmitri Tikhonov                    int is_server, const struct http_prio_frame *prio_frame,
49450aadb33SDmitri Tikhonov                    const struct lsquic_http_headers *headers)
49550aadb33SDmitri Tikhonov{
4965392f7a3SLiteSpeed Tech    lsquic_stream_id_t dep_stream_id;
49750aadb33SDmitri Tikhonov    int exclusive, i;
49850aadb33SDmitri Tikhonov    unsigned short weight;
49950aadb33SDmitri Tikhonov
50050aadb33SDmitri Tikhonov    if (is_server)
5015392f7a3SLiteSpeed Tech        LCID("generated HTTP response HEADERS for stream %"PRIu64, stream_id);
50250aadb33SDmitri Tikhonov    else
50350aadb33SDmitri Tikhonov    {
50450aadb33SDmitri Tikhonov        memcpy(&dep_stream_id, prio_frame->hpf_stream_id, 4);
50550aadb33SDmitri Tikhonov        dep_stream_id = htonl(dep_stream_id);
50650aadb33SDmitri Tikhonov        exclusive = dep_stream_id >> 31;
50750aadb33SDmitri Tikhonov        dep_stream_id &= ~(1 << 31);
50850aadb33SDmitri Tikhonov        weight = prio_frame->hpf_weight + 1;
5095392f7a3SLiteSpeed Tech        LCID("generated HTTP request HEADERS for stream %"PRIu64
5105392f7a3SLiteSpeed Tech            ", dep stream: %"PRIu64", weight: %hu, exclusive: %d", stream_id,
51150aadb33SDmitri Tikhonov            dep_stream_id, weight, exclusive);
51250aadb33SDmitri Tikhonov    }
51350aadb33SDmitri Tikhonov
51450aadb33SDmitri Tikhonov    for (i = 0; i < headers->count; ++i)
51555613f44SDmitri Tikhonov        if (headers->headers[i].buf)
51655613f44SDmitri Tikhonov            LCID("  %.*s: %.*s",
51755613f44SDmitri Tikhonov                (int)    headers->headers[i].name_len,
51855613f44SDmitri Tikhonov                lsxpack_header_get_name(&headers->headers[i]),
51955613f44SDmitri Tikhonov                (int)    headers->headers[i].val_len,
52055613f44SDmitri Tikhonov                lsxpack_header_get_value(&headers->headers[i]));
52150aadb33SDmitri Tikhonov}
52250aadb33SDmitri Tikhonov
52350aadb33SDmitri Tikhonov
52450aadb33SDmitri Tikhonovvoid
5255392f7a3SLiteSpeed Techlsquic_ev_log_generated_http_push_promise (const lsquic_cid_t *cid,
5265392f7a3SLiteSpeed Tech            lsquic_stream_id_t stream_id, lsquic_stream_id_t promised_stream_id,
52755613f44SDmitri Tikhonov            const struct lsquic_http_headers *headers)
52850aadb33SDmitri Tikhonov{
52950aadb33SDmitri Tikhonov    int i;
53050aadb33SDmitri Tikhonov
5315392f7a3SLiteSpeed Tech    LCID("generated HTTP PUSH_PROMISE for stream %"PRIu64"; promised stream %"
5325392f7a3SLiteSpeed Tech        PRIu64, stream_id, promised_stream_id);
53350aadb33SDmitri Tikhonov
53450aadb33SDmitri Tikhonov    for (i = 0; i < headers->count; ++i)
53555613f44SDmitri Tikhonov        if (headers->headers[i].buf)
53650aadb33SDmitri Tikhonov            LCID("  %.*s: %.*s",
53755613f44SDmitri Tikhonov                (int)    headers->headers[i].name_len,
53855613f44SDmitri Tikhonov                lsxpack_header_get_name(&headers->headers[i]),
53955613f44SDmitri Tikhonov                (int)    headers->headers[i].val_len,
54055613f44SDmitri Tikhonov                lsxpack_header_get_value(&headers->headers[i]));
54150aadb33SDmitri Tikhonov}
54255cd0b38SDmitri Tikhonov
54355cd0b38SDmitri Tikhonovvoid
5445392f7a3SLiteSpeed Techlsquic_ev_log_create_connection (const lsquic_cid_t *cid,
54555cd0b38SDmitri Tikhonov                                    const struct sockaddr *local_sa,
54655cd0b38SDmitri Tikhonov                                    const struct sockaddr *peer_sa)
54755cd0b38SDmitri Tikhonov{
54855cd0b38SDmitri Tikhonov    LCID("connection created");
54955cd0b38SDmitri Tikhonov}
55055cd0b38SDmitri Tikhonov
55155cd0b38SDmitri Tikhonov
55255cd0b38SDmitri Tikhonovvoid
5535392f7a3SLiteSpeed Techlsquic_ev_log_hsk_completed (const lsquic_cid_t *cid)
55455cd0b38SDmitri Tikhonov{
55555cd0b38SDmitri Tikhonov    LCID("handshake completed");
55655cd0b38SDmitri Tikhonov}
55755cd0b38SDmitri Tikhonov
55855cd0b38SDmitri Tikhonov
55955cd0b38SDmitri Tikhonovvoid
5607483dee0SDmitri Tikhonovlsquic_ev_log_sess_resume (const lsquic_cid_t *cid)
56155cd0b38SDmitri Tikhonov{
5627483dee0SDmitri Tikhonov    LCID("sess_resume successful");
56355cd0b38SDmitri Tikhonov}
56455cd0b38SDmitri Tikhonov
56555cd0b38SDmitri Tikhonov
56655cd0b38SDmitri Tikhonovvoid
5675392f7a3SLiteSpeed Techlsquic_ev_log_check_certs (const lsquic_cid_t *cid, const lsquic_str_t **certs,
56855cd0b38SDmitri Tikhonov                                                                size_t count)
56955cd0b38SDmitri Tikhonov{
57055cd0b38SDmitri Tikhonov    LCID("check certs");
57155cd0b38SDmitri Tikhonov}
57255cd0b38SDmitri Tikhonov
57355cd0b38SDmitri Tikhonov
57455cd0b38SDmitri Tikhonovvoid
575b55a5117SDmitri Tikhonovlsquic_ev_log_cert_chain (const lsquic_cid_t *cid, struct stack_st_X509 *chain)
576b55a5117SDmitri Tikhonov{
577b55a5117SDmitri Tikhonov    X509_NAME *name;
578b55a5117SDmitri Tikhonov    X509 *cert;
579b55a5117SDmitri Tikhonov    unsigned i;
580b55a5117SDmitri Tikhonov    char buf[0x100];
581b55a5117SDmitri Tikhonov
582b55a5117SDmitri Tikhonov    for (i = 0; i < sk_X509_num(chain); ++i)
583b55a5117SDmitri Tikhonov    {
584b55a5117SDmitri Tikhonov        cert = sk_X509_value(chain, i);
585b55a5117SDmitri Tikhonov        name = X509_get_subject_name(cert);
586b55a5117SDmitri Tikhonov        LCID("cert #%u: name: %s", i,
587b55a5117SDmitri Tikhonov                                X509_NAME_oneline(name, buf, sizeof(buf)));
588b55a5117SDmitri Tikhonov    }
589b55a5117SDmitri Tikhonov}
590b55a5117SDmitri Tikhonov
591b55a5117SDmitri Tikhonov
592b55a5117SDmitri Tikhonovvoid
5935392f7a3SLiteSpeed Techlsquic_ev_log_version_negotiation (const lsquic_cid_t *cid,
59455cd0b38SDmitri Tikhonov                                        const char *action, const char *ver)
59555cd0b38SDmitri Tikhonov{
59655cd0b38SDmitri Tikhonov    LCID("version negotiation: %s version %s", action, ver);
59755cd0b38SDmitri Tikhonov}
598