mirror of
				https://gitea.invidious.io/iv-org/litespeed-quic.git
				synced 2024-08-15 00:53:43 +00:00 
			
		
		
		
	Merge branch 'master' of github.com:litespeedtech/lsquic
This commit is contained in:
		
						commit
						a5347f2374
					
				
					 11 changed files with 161 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -231,7 +231,7 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
 | 
			
		|||
    link_directories( /usr/local/lib )
 | 
			
		||||
ENDIF()
 | 
			
		||||
 | 
			
		||||
IF (CMAKE_SYSTEM_NAME STREQUAL Windows)
 | 
			
		||||
IF (CMAKE_SYSTEM_NAME STREQUAL Windows AND LSQUIC_TESTS AND LSQUIC_BIN)
 | 
			
		||||
    FIND_PATH(GETOPT_INCLUDE_DIR NAMES getopt.h)
 | 
			
		||||
    IF (GETOPT_INCLUDE_DIR)
 | 
			
		||||
        INCLUDE_DIRECTORIES(${GETOPT_INCLUDE_DIR})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2243,7 +2243,16 @@ iquic_esf_decrypt_packet (enc_session_t *enc_session_p,
 | 
			
		|||
    size_t out_sz;
 | 
			
		||||
    enum dec_packin dec_packin;
 | 
			
		||||
    int s;
 | 
			
		||||
    const size_t dst_sz = packet_in->pi_data_sz;
 | 
			
		||||
    /* 16Bytes: AEAD authentication tag
 | 
			
		||||
     *
 | 
			
		||||
     * [RFC5116 AEAD] Section 5.1
 | 
			
		||||
     *  An authentication tag with a length of 16 octets (128bits) is used.
 | 
			
		||||
     *
 | 
			
		||||
     * [RFC9001 QUIC-TLS] Section 5.3
 | 
			
		||||
     *  These cipher suites have a 16-byte authentication tag and
 | 
			
		||||
     *  produce an output 16 bytes larger than their input.
 | 
			
		||||
     */
 | 
			
		||||
    const size_t dst_sz = packet_in->pi_data_sz - 16;
 | 
			
		||||
    unsigned char new_secret[EVP_MAX_KEY_LENGTH];
 | 
			
		||||
    struct crypto_ctx crypto_ctx_buf;
 | 
			
		||||
    char secret_str[EVP_MAX_KEY_LENGTH * 2 + 1];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,7 +86,6 @@
 | 
			
		|||
#include "lsquic_handshake.h"
 | 
			
		||||
#include "lsquic_crand.h"
 | 
			
		||||
#include "lsquic_ietf.h"
 | 
			
		||||
#include "lsquic_handshake.h"
 | 
			
		||||
 | 
			
		||||
#define LSQUIC_LOGGER_MODULE LSQLM_ENGINE
 | 
			
		||||
#include "lsquic_logger.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -262,6 +261,7 @@ struct lsquic_engine
 | 
			
		|||
    unsigned                           n_conns;
 | 
			
		||||
    lsquic_time_t                      deadline;
 | 
			
		||||
    lsquic_time_t                      resume_sending_at;
 | 
			
		||||
    lsquic_time_t                      mem_logged_last;
 | 
			
		||||
    unsigned                           mini_conns_count;
 | 
			
		||||
    struct lsquic_purga               *purga;
 | 
			
		||||
#if LSQUIC_CONN_STATS
 | 
			
		||||
| 
						 | 
				
			
			@ -961,6 +961,51 @@ destroy_conn (struct lsquic_engine *engine, struct lsquic_conn *conn,
 | 
			
		|||
    --engine->n_conns;
 | 
			
		||||
    conn->cn_flags |= LSCONN_NEVER_TICKABLE;
 | 
			
		||||
    conn->cn_if->ci_destroy(conn);
 | 
			
		||||
 | 
			
		||||
    if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)  /* log period: 10s */
 | 
			
		||||
        && ((engine->mem_logged_last + 10000000 <= now) || (engine->n_conns == 0)))
 | 
			
		||||
    {
 | 
			
		||||
#define MAX_MM_STAT_LOG 4096
 | 
			
		||||
        unsigned cur = 0;
 | 
			
		||||
        unsigned ret = 0;
 | 
			
		||||
        unsigned idx = 0;
 | 
			
		||||
        char mm_log[MAX_MM_STAT_LOG] = {0};
 | 
			
		||||
        struct pool_stats *poolst = NULL;
 | 
			
		||||
 | 
			
		||||
        engine->mem_logged_last = now;
 | 
			
		||||
 | 
			
		||||
        ret = snprintf(mm_log + cur, MAX_MM_STAT_LOG - cur,
 | 
			
		||||
            "%p, conns: %u, mini_conns: %u. mm_stat, used: %zu"
 | 
			
		||||
            ", pool(calls-objs_all-objs_out-max-avg-var), pib",
 | 
			
		||||
            engine, engine->n_conns, engine->mini_conns_count,
 | 
			
		||||
            lsquic_mm_mem_used(&engine->pub.enp_mm));
 | 
			
		||||
        cur += ret;
 | 
			
		||||
 | 
			
		||||
        for (idx = 0; idx < MM_N_IN_BUCKETS && cur < MAX_MM_STAT_LOG; idx++)
 | 
			
		||||
        {
 | 
			
		||||
            poolst = &engine->pub.enp_mm.packet_in_bstats[idx];
 | 
			
		||||
            ret = snprintf(mm_log + cur, MAX_MM_STAT_LOG - cur,
 | 
			
		||||
                ": [%u]%u-%u-%u-%u-%u-%u", idx,
 | 
			
		||||
                poolst->ps_calls, poolst->ps_objs_all, poolst->ps_objs_out,
 | 
			
		||||
                poolst->ps_max, poolst->ps_max_avg, poolst->ps_max_var);
 | 
			
		||||
            cur += ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = snprintf(mm_log + cur, MAX_MM_STAT_LOG - cur, ", pob");
 | 
			
		||||
        cur += ret;
 | 
			
		||||
 | 
			
		||||
        for (idx = 0; idx < MM_N_OUT_BUCKETS && cur < MAX_MM_STAT_LOG; idx++)
 | 
			
		||||
        {
 | 
			
		||||
            poolst = &engine->pub.enp_mm.packet_out_bstats[idx];
 | 
			
		||||
            ret = snprintf(mm_log + cur, MAX_MM_STAT_LOG - cur,
 | 
			
		||||
                ": [%u]%u-%u-%u-%u-%u-%u", idx,
 | 
			
		||||
                poolst->ps_calls, poolst->ps_objs_all, poolst->ps_objs_out,
 | 
			
		||||
                poolst->ps_max, poolst->ps_max_avg, poolst->ps_max_var);
 | 
			
		||||
            cur += ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LSQ_DEBUG("%s", mm_log);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3411,6 +3411,8 @@ full_conn_ci_tick (lsquic_conn_t *lconn, lsquic_time_t now)
 | 
			
		|||
    ++conn->fc_stats.n_ticks;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    CLOSE_IF_NECESSARY();
 | 
			
		||||
 | 
			
		||||
    if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)
 | 
			
		||||
        && conn->fc_mem_logged_last + 1000000 <= now)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1886,7 +1886,7 @@ generate_ack_frame_for_pns (struct ietf_full_conn *conn,
 | 
			
		|||
            &conn->ifc_rechist[pns], now, &has_missing, &packet_out->po_ack2ed,
 | 
			
		||||
            ecn_counts);
 | 
			
		||||
    if (w < 0) {
 | 
			
		||||
        ABORT_ERROR("generating ACK frame failed: %d", errno);
 | 
			
		||||
        ABORT_ERROR("%s generating ACK frame failed: %d", lsquic_pns2str[pns], errno);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    CONN_STATS(out.acks, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -8201,6 +8201,8 @@ ietf_full_conn_ci_tick (struct lsquic_conn *lconn, lsquic_time_t now)
 | 
			
		|||
 | 
			
		||||
    CONN_STATS(n_ticks, 1);
 | 
			
		||||
 | 
			
		||||
    CLOSE_IF_NECESSARY();
 | 
			
		||||
 | 
			
		||||
    if (conn->ifc_flags & IFC_HAVE_SAVED_ACK)
 | 
			
		||||
    {
 | 
			
		||||
        (void) /* If there is an error, we'll fail shortly */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,10 @@
 | 
			
		|||
#ifndef LSQUIC_HASH_H
 | 
			
		||||
#define LSQUIC_HASH_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct lsquic_hash;
 | 
			
		||||
 | 
			
		||||
struct lsquic_hash_elem
 | 
			
		||||
| 
						 | 
				
			
			@ -58,4 +62,9 @@ lsquic_hash_count (struct lsquic_hash *);
 | 
			
		|||
 | 
			
		||||
size_t
 | 
			
		||||
lsquic_hash_mem_used (const struct lsquic_hash *);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -527,12 +527,23 @@ h1h_prepare_decode (void *hset, struct lsxpack_header *xhdr, size_t req_space)
 | 
			
		|||
        if (0 == hwc->hwc_header_buf_nalloc
 | 
			
		||||
                                    || req_space > hwc->hwc_header_buf_nalloc)
 | 
			
		||||
        {
 | 
			
		||||
            buf = malloc(req_space);
 | 
			
		||||
            if (0 == hwc->hwc_header_buf_nalloc)
 | 
			
		||||
            {
 | 
			
		||||
                buf = malloc(req_space);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                buf = realloc(hwc->hwc_xhdr.buf, req_space);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!buf)
 | 
			
		||||
            {
 | 
			
		||||
                LSQ_DEBUG("cannot allocate %zd bytes", req_space);
 | 
			
		||||
                LSQ_WARN("cannot %s %zd bytes",
 | 
			
		||||
                    hwc->hwc_header_buf_nalloc ? "reallocate to" : "allocate", req_space);
 | 
			
		||||
                return NULL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            hwc->hwc_xhdr.buf = buf;
 | 
			
		||||
            hwc->hwc_header_buf_nalloc = req_space;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,21 +192,15 @@ void
 | 
			
		|||
lsquic_mm_put_packet_in (struct lsquic_mm *mm,
 | 
			
		||||
                                        struct lsquic_packet_in *packet_in)
 | 
			
		||||
{
 | 
			
		||||
#if LSQUIC_USE_POOLS
 | 
			
		||||
    unsigned idx;
 | 
			
		||||
    struct packet_in_buf *pib;
 | 
			
		||||
 | 
			
		||||
    assert(0 == packet_in->pi_refcnt);
 | 
			
		||||
    if (packet_in->pi_flags & PI_OWN_DATA)
 | 
			
		||||
    {
 | 
			
		||||
        pib = (struct packet_in_buf *) packet_in->pi_data;
 | 
			
		||||
        idx = packet_in_index(packet_in->pi_data_sz);
 | 
			
		||||
        SLIST_INSERT_HEAD(&mm->packet_in_bufs[idx], pib, next_pib);
 | 
			
		||||
        lsquic_mm_put_packet_in_buf(mm, packet_in->pi_data, packet_in->pi_data_sz);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if LSQUIC_USE_POOLS
 | 
			
		||||
    TAILQ_INSERT_HEAD(&mm->free_packets_in, packet_in, pi_next);
 | 
			
		||||
#else
 | 
			
		||||
    if (packet_in->pi_flags & PI_OWN_DATA)
 | 
			
		||||
        free(packet_in->pi_data);
 | 
			
		||||
    lsquic_malo_put(packet_in);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -370,6 +364,42 @@ maybe_shrink_packet_out_bufs (struct lsquic_mm *mm, unsigned idx)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* If average maximum falls under 1/4 of all objects allocated, release
 | 
			
		||||
 * half of the objects allocated.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
maybe_shrink_packet_in_bufs (struct lsquic_mm *mm, unsigned idx)
 | 
			
		||||
{
 | 
			
		||||
    struct pool_stats *poolst;
 | 
			
		||||
    struct packet_in_buf *pib;
 | 
			
		||||
    unsigned n_to_leave;
 | 
			
		||||
 | 
			
		||||
    poolst = &mm->packet_in_bstats[idx];
 | 
			
		||||
    if (poolst->ps_max_avg * 4 < poolst->ps_objs_all)
 | 
			
		||||
    {
 | 
			
		||||
        n_to_leave = poolst->ps_objs_all / 2;
 | 
			
		||||
        while (poolst->ps_objs_all > n_to_leave
 | 
			
		||||
                        && (pib = SLIST_FIRST(&mm->packet_in_bufs[idx])))
 | 
			
		||||
        {
 | 
			
		||||
            SLIST_REMOVE_HEAD(&mm->packet_in_bufs[idx], next_pib);
 | 
			
		||||
            free(pib);
 | 
			
		||||
            --poolst->ps_objs_all;
 | 
			
		||||
        }
 | 
			
		||||
#if LSQUIC_LOG_POOL_STATS
 | 
			
		||||
        LSQ_DEBUG("pib pool #%u; max avg %u; shrank from %u to %u objs",
 | 
			
		||||
                idx, poolst->ps_max_avg, n_to_leave * 2, poolst->ps_objs_all);
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
#if LSQUIC_LOG_POOL_STATS
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        LSQ_DEBUG("pib pool #%u; max avg %u; objs: %u; won't shrink",
 | 
			
		||||
                                idx, poolst->ps_max_avg, poolst->ps_objs_all);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
lsquic_mm_put_packet_out (struct lsquic_mm *mm,
 | 
			
		||||
                          struct lsquic_packet_out *packet_out)
 | 
			
		||||
| 
						 | 
				
			
			@ -456,9 +486,25 @@ lsquic_mm_get_packet_in_buf (struct lsquic_mm *mm, size_t size)
 | 
			
		|||
    pib = SLIST_FIRST(&mm->packet_in_bufs[idx]);
 | 
			
		||||
    fiu_do_on("mm/packet_in_buf", FAIL_NOMEM);
 | 
			
		||||
    if (pib)
 | 
			
		||||
    {
 | 
			
		||||
        SLIST_REMOVE_HEAD(&mm->packet_in_bufs[idx], next_pib);
 | 
			
		||||
        poolst_allocated(&mm->packet_in_bstats[idx], 0);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        pib = malloc(packet_in_sizes[idx]);
 | 
			
		||||
        if (!pib)
 | 
			
		||||
        {
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        poolst_allocated(&mm->packet_in_bstats[idx], 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (poolst_has_new_sample(&mm->packet_in_bstats[idx]))
 | 
			
		||||
    {
 | 
			
		||||
        maybe_shrink_packet_in_bufs(mm, idx);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    pib = malloc(size);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -476,6 +522,12 @@ lsquic_mm_put_packet_in_buf (struct lsquic_mm *mm, void *mem, size_t size)
 | 
			
		|||
    pib = (struct packet_in_buf *) mem;
 | 
			
		||||
    idx = packet_in_index(size);
 | 
			
		||||
    SLIST_INSERT_HEAD(&mm->packet_in_bufs[idx], pib, next_pib);
 | 
			
		||||
 | 
			
		||||
    poolst_freed(&mm->packet_in_bstats[idx]);
 | 
			
		||||
    if (poolst_has_new_sample(&mm->packet_in_bstats[idx]))
 | 
			
		||||
    {
 | 
			
		||||
        maybe_shrink_packet_in_bufs(mm, idx);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    free(mem);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,6 +44,7 @@ struct lsquic_mm {
 | 
			
		|||
    TAILQ_HEAD(, lsquic_packet_in)  free_packets_in;
 | 
			
		||||
    SLIST_HEAD(, packet_out_buf)    packet_out_bufs[MM_N_OUT_BUCKETS];
 | 
			
		||||
    struct pool_stats               packet_out_bstats[MM_N_OUT_BUCKETS];
 | 
			
		||||
    struct pool_stats               packet_in_bstats[MM_N_IN_BUCKETS];
 | 
			
		||||
    SLIST_HEAD(, packet_in_buf)     packet_in_bufs[MM_N_IN_BUCKETS];
 | 
			
		||||
    SLIST_HEAD(, four_k_page)       four_k_pages;
 | 
			
		||||
    SLIST_HEAD(, sixteen_k_page)    sixteen_k_pages;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3424,6 +3424,8 @@ lsquic_send_ctl_empty_pns (struct lsquic_send_ctl *ctl, enum packnum_space pns)
 | 
			
		|||
 | 
			
		||||
    lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns);
 | 
			
		||||
 | 
			
		||||
    ctl->sc_flags &= ~(SC_LOST_ACK_INIT << pns);
 | 
			
		||||
 | 
			
		||||
    LSQ_DEBUG("emptied %s, destroyed %u packet%.*s", lsquic_pns2str[pns],
 | 
			
		||||
        count, count != 1, "s");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -205,31 +205,32 @@ test6 (void)
 | 
			
		|||
    lsquic_rechist_t rechist;
 | 
			
		||||
    char buf[256];
 | 
			
		||||
    long int time = 12087061905875;
 | 
			
		||||
   
 | 
			
		||||
    unsigned i;
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_init(&rechist, 0, 0);
 | 
			
		||||
   
 | 
			
		||||
    for (int i = 0; i <= 3; i++) 
 | 
			
		||||
        lsquic_rechist_received(&rechist, i, (time += (i*10)));
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i <= 3; i++)
 | 
			
		||||
        lsquic_rechist_received(&rechist, i, (time += (i * 10)));
 | 
			
		||||
    lsquic_rechist_stop_wait(&rechist, 2);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_received(&rechist, 4, (time += 10));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_stop_wait(&rechist, 3);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_received(&rechist, 5, (time += 10));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_stop_wait(&rechist, 3);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_received(&rechist, 6, (time += 10));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_stop_wait(&rechist, 9);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_received(&rechist, 7, (time += 10));
 | 
			
		||||
    lsquic_rechist_received(&rechist, 8, (time += 10));
 | 
			
		||||
    lsquic_rechist_received(&rechist, 9, (time += 10));
 | 
			
		||||
 | 
			
		||||
    rechist2str(&rechist, buf, sizeof(buf));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    lsquic_rechist_cleanup(&rechist);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue