Lines Matching refs:encoder

38    or acknowledge header block.  After this limit, encoder stops using
788 static void encoder_qpack_map_find(nghttp3_qpack_encoder *encoder,
801 for (p = encoder->dtable_map.table[hash & (NGHTTP3_QPACK_MAP_SIZE - 1)]; p;
805 !qpack_context_can_reference(&encoder->ctx, p->absidx)) {
905 int nghttp3_qpack_encoder_init(nghttp3_qpack_encoder *encoder,
910 rv = qpack_context_init(&encoder->ctx, hard_max_dtable_capacity, 0, mem);
915 nghttp3_map_init(&encoder->streams, mem);
917 nghttp3_ksl_init(&encoder->blocked_streams, max_cnt_greater,
920 qpack_map_init(&encoder->dtable_map);
921 nghttp3_pq_init(&encoder->min_cnts, ref_min_cnt_less, mem);
923 encoder->krcnt = 0;
924 encoder->state = NGHTTP3_QPACK_DS_STATE_OPCODE;
925 encoder->opcode = 0;
926 encoder->min_dtable_update = SIZE_MAX;
927 encoder->last_max_dtable_update = 0;
928 encoder->flags = NGHTTP3_QPACK_ENCODER_FLAG_NONE;
930 nghttp3_qpack_read_state_reset(&encoder->rstate);
942 void nghttp3_qpack_encoder_free(nghttp3_qpack_encoder *encoder) {
943 nghttp3_pq_free(&encoder->min_cnts);
944 nghttp3_ksl_free(&encoder->blocked_streams);
945 nghttp3_map_each_free(&encoder->streams, map_stream_free,
946 (void *)encoder->ctx.mem);
947 nghttp3_map_free(&encoder->streams);
948 qpack_context_free(&encoder->ctx);
952 nghttp3_qpack_encoder *encoder, size_t max_dtable_capacity) {
954 nghttp3_min(max_dtable_capacity, encoder->ctx.hard_max_dtable_capacity);
956 if (encoder->ctx.max_dtable_capacity == max_dtable_capacity) {
960 encoder->flags |= NGHTTP3_QPACK_ENCODER_FLAG_PENDING_SET_DTABLE_CAP;
962 if (encoder->min_dtable_update > max_dtable_capacity) {
963 encoder->min_dtable_update = max_dtable_capacity;
964 encoder->ctx.max_dtable_capacity = max_dtable_capacity;
966 encoder->last_max_dtable_update = max_dtable_capacity;
970 nghttp3_qpack_encoder *encoder, size_t max_blocked_streams) {
971 encoder->ctx.max_blocked_streams = max_blocked_streams;
974 uint64_t nghttp3_qpack_encoder_get_min_cnt(nghttp3_qpack_encoder *encoder) {
975 assert(!nghttp3_pq_empty(&encoder->min_cnts));
977 return nghttp3_struct_of(nghttp3_pq_top(&encoder->min_cnts),
982 void nghttp3_qpack_encoder_shrink_dtable(nghttp3_qpack_encoder *encoder) {
983 nghttp3_ringbuf *dtable = &encoder->ctx.dtable;
984 const nghttp3_mem *mem = encoder->ctx.mem;
989 if (encoder->ctx.dtable_size <= encoder->ctx.max_dtable_capacity) {
993 if (!nghttp3_pq_empty(&encoder->min_cnts)) {
994 min_cnt = nghttp3_qpack_encoder_get_min_cnt(encoder);
997 for (; encoder->ctx.dtable_size > encoder->ctx.max_dtable_capacity;) {
1004 encoder->ctx.dtable_size -=
1008 qpack_map_remove(&encoder->dtable_map, ent);
1028 static int qpack_encoder_add_stream_ref(nghttp3_qpack_encoder *encoder,
1033 const nghttp3_mem *mem = encoder->ctx.mem;
1043 rv = nghttp3_map_insert(&encoder->streams,
1052 if (nghttp3_qpack_encoder_stream_is_blocked(encoder, stream) &&
1054 nghttp3_qpack_encoder_unblock_stream(encoder, stream);
1070 nghttp3_qpack_encoder_stream_is_blocked(encoder, stream)) {
1071 rv = nghttp3_qpack_encoder_block_stream(encoder, stream);
1077 return nghttp3_pq_push(&encoder->min_cnts, &ref->min_cnts_pe);
1080 static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder,
1085 nghttp3_map_remove(&encoder->streams,
1095 nghttp3_pq_remove(&encoder->min_cnts, &ref->min_cnts_pe);
1139 int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder,
1151 if (encoder->ctx.bad) {
1155 rv = nghttp3_qpack_encoder_process_dtable_update(encoder, ebuf);
1160 base = encoder->ctx.next_absidx;
1162 stream = nghttp3_qpack_encoder_find_stream(encoder, stream_id);
1164 stream && nghttp3_qpack_encoder_stream_is_blocked(encoder, stream);
1166 blocked_stream || encoder->ctx.max_blocked_streams >
1167 nghttp3_ksl_len(&encoder->blocked_streams);
1173 rv = nghttp3_qpack_encoder_encode_nv(encoder, &max_cnt, &min_cnt, rbuf,
1180 nghttp3_qpack_encoder_write_field_section_prefix(encoder, pbuf, max_cnt,
1188 rv = qpack_encoder_add_stream_ref(encoder, stream_id, stream, max_cnt,
1197 encoder->ctx.bad = 1;
1235 int nghttp3_qpack_encoder_process_dtable_update(nghttp3_qpack_encoder *encoder,
1239 nghttp3_qpack_encoder_shrink_dtable(encoder);
1241 if (encoder->ctx.max_dtable_capacity < encoder->ctx.dtable_size ||
1242 !(encoder->flags & NGHTTP3_QPACK_ENCODER_FLAG_PENDING_SET_DTABLE_CAP)) {
1246 if (encoder->min_dtable_update < encoder->last_max_dtable_update) {
1247 rv = nghttp3_qpack_encoder_write_set_dtable_cap(encoder, ebuf,
1248 encoder->min_dtable_update);
1255 encoder, ebuf, encoder->last_max_dtable_update);
1260 encoder->flags &= (uint8_t)~NGHTTP3_QPACK_ENCODER_FLAG_PENDING_SET_DTABLE_CAP;
1261 encoder->min_dtable_update = SIZE_MAX;
1262 encoder->ctx.max_dtable_capacity = encoder->last_max_dtable_update;
1267 int nghttp3_qpack_encoder_write_set_dtable_cap(nghttp3_qpack_encoder *encoder,
1270 return qpack_write_number(ebuf, 0x20, cap, 5, encoder->ctx.mem);
1274 nghttp3_qpack_encoder_find_stream(nghttp3_qpack_encoder *encoder,
1276 return nghttp3_map_find(&encoder->streams, (nghttp3_map_key_type)stream_id);
1279 int nghttp3_qpack_encoder_stream_is_blocked(nghttp3_qpack_encoder *encoder,
1281 return stream && encoder->krcnt < nghttp3_qpack_stream_get_max_cnt(stream);
1290 qpack_encoder_decide_indexing_mode(nghttp3_qpack_encoder *encoder,
1326 encoder->ctx.max_dtable_capacity * 3 / 4) {
1338 static int qpack_encoder_can_index(nghttp3_qpack_encoder *encoder, size_t need,
1344 nghttp3_ringbuf *dtable = &encoder->ctx.dtable;
1346 if (encoder->ctx.max_dtable_capacity > encoder->ctx.dtable_size) {
1347 avail = encoder->ctx.max_dtable_capacity - encoder->ctx.dtable_size;
1353 if (!nghttp3_pq_empty(&encoder->min_cnts)) {
1354 gmin_cnt = nghttp3_qpack_encoder_get_min_cnt(encoder);
1359 return encoder->ctx.max_dtable_capacity >= need;
1362 min_ent = nghttp3_qpack_context_dtable_get(&encoder->ctx, min_cnt - 1);
1364 len = nghttp3_ringbuf_len(&encoder->ctx.dtable);
1380 static int qpack_encoder_can_index_nv(nghttp3_qpack_encoder *encoder,
1383 encoder, table_space(nv->namelen, nv->valuelen), min_cnt);
1392 static int qpack_encoder_can_index_duplicate(nghttp3_qpack_encoder *encoder,
1396 nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx);
1399 encoder, table_space(ent->nv.name->len, ent->nv.value->len), min_cnt);
1415 int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder,
1450 indexing_mode = qpack_encoder_decide_indexing_mode(encoder, nv, token);
1455 return nghttp3_qpack_encoder_write_static_indexed(encoder, rbuf,
1461 nghttp3_map_size(&encoder->streams) < NGHTTP3_QPACK_MAX_QPACK_STREAMS) {
1462 dres = nghttp3_qpack_encoder_lookup_dtable(encoder, nv, token, hash,
1463 indexing_mode, encoder->krcnt,
1471 qpack_context_check_draining(&encoder->ctx, (size_t)dres.index) &&
1472 qpack_encoder_can_index_duplicate(encoder, (size_t)dres.index,
1474 rv = nghttp3_qpack_encoder_write_duplicate_insert(encoder, ebuf,
1479 rv = nghttp3_qpack_encoder_dtable_duplicate_add(encoder,
1485 new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx);
1492 encoder, rbuf, (size_t)dres.index, base);
1496 if (just_index && qpack_encoder_can_index_nv(encoder, nv, *pmin_cnt)) {
1497 rv = nghttp3_qpack_encoder_write_static_insert(encoder, ebuf,
1502 rv = nghttp3_qpack_encoder_dtable_static_add(encoder, (size_t)sres.index,
1508 new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx);
1513 encoder, rbuf, new_ent->absidx, base);
1518 encoder, rbuf, (size_t)sres.index, nv);
1524 encoder, nv,
1527 rv = nghttp3_qpack_encoder_write_dynamic_insert(encoder, ebuf,
1537 rv = nghttp3_qpack_encoder_dtable_dynamic_add(encoder, (size_t)dres.index,
1544 new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx);
1549 encoder, rbuf, new_ent->absidx, base);
1557 encoder, rbuf, (size_t)dres.index, base, nv);
1560 if (just_index && qpack_encoder_can_index_nv(encoder, nv, *pmin_cnt)) {
1561 rv = nghttp3_qpack_encoder_dtable_literal_add(encoder, nv, token, hash);
1565 rv = nghttp3_qpack_encoder_write_literal_insert(encoder, ebuf, nv);
1570 new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx);
1574 return nghttp3_qpack_encoder_write_dynamic_indexed(encoder, rbuf,
1579 return nghttp3_qpack_encoder_write_literal(encoder, rbuf, nv);
1613 nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token,
1620 encoder_qpack_map_find(encoder, &exact_match, &match, &pb_match, nv, token,
1764 int nghttp3_qpack_encoder_write_static_indexed(nghttp3_qpack_encoder *encoder,
1769 return qpack_write_number(rbuf, 0xc0, absidx, 6, encoder->ctx.mem);
1772 int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder,
1782 encoder->ctx.mem);
1785 return qpack_write_number(rbuf, 0x10, absidx - base, 4, encoder->ctx.mem);
1800 static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder,
1818 rv = reserve_buf(buf, len, encoder->ctx.mem);
1848 nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx,
1856 return qpack_encoder_write_indexed_name(encoder, rbuf, fb, absidx, 4, nv);
1860 nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx,
1871 return qpack_encoder_write_indexed_name(encoder, rbuf, fb,
1876 return qpack_encoder_write_indexed_name(encoder, rbuf, fb, absidx - base, 3,
1892 static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder,
1917 rv = reserve_buf(buf, len, encoder->ctx.mem);
1956 int nghttp3_qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder,
1963 return qpack_encoder_write_literal(encoder, rbuf, fb, 3, nv);
1966 int nghttp3_qpack_encoder_write_static_insert(nghttp3_qpack_encoder *encoder,
1973 return qpack_encoder_write_indexed_name(encoder, ebuf, 0xc0, absidx, 6, nv);
1976 int nghttp3_qpack_encoder_write_dynamic_insert(nghttp3_qpack_encoder *encoder,
1984 encoder, ebuf, 0x80, encoder->ctx.next_absidx - absidx - 1, 6, nv);
1987 int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder,
1990 uint64_t idx = encoder->ctx.next_absidx - absidx - 1;
1997 rv = reserve_buf(ebuf, len, encoder->ctx.mem);
2014 int nghttp3_qpack_encoder_write_literal_insert(nghttp3_qpack_encoder *encoder,
2018 return qpack_encoder_write_literal(encoder, ebuf, 0x40, 5, nv);
2086 int nghttp3_qpack_encoder_dtable_static_add(nghttp3_qpack_encoder *encoder,
2092 const nghttp3_mem *mem = encoder->ctx.mem;
2108 rv = nghttp3_qpack_context_dtable_add(&encoder->ctx, &qnv,
2109 &encoder->dtable_map, hash);
2116 int nghttp3_qpack_encoder_dtable_dynamic_add(nghttp3_qpack_encoder *encoder,
2122 const nghttp3_mem *mem = encoder->ctx.mem;
2130 ent = nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx);
2138 rv = nghttp3_qpack_context_dtable_add(&encoder->ctx, &qnv,
2139 &encoder->dtable_map, hash);
2147 int nghttp3_qpack_encoder_dtable_duplicate_add(nghttp3_qpack_encoder *encoder,
2153 ent = nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx);
2159 rv = nghttp3_qpack_context_dtable_add(&encoder->ctx, &qnv,
2160 &encoder->dtable_map, ent->hash);
2168 int nghttp3_qpack_encoder_dtable_literal_add(nghttp3_qpack_encoder *encoder,
2172 const nghttp3_mem *mem = encoder->ctx.mem;
2189 rv = nghttp3_qpack_context_dtable_add(&encoder->ctx, &qnv,
2190 &encoder->dtable_map, hash);
2233 int nghttp3_qpack_encoder_block_stream(nghttp3_qpack_encoder *encoder,
2241 return nghttp3_ksl_insert(&encoder->blocked_streams, NULL, &bsk, stream);
2244 void nghttp3_qpack_encoder_unblock_stream(nghttp3_qpack_encoder *encoder,
2254 it = nghttp3_ksl_lower_bound(&encoder->blocked_streams, &bsk);
2259 nghttp3_ksl_remove_hint(&encoder->blocked_streams, NULL, &it, &bsk);
2262 void nghttp3_qpack_encoder_unblock(nghttp3_qpack_encoder *encoder,
2267 it = nghttp3_ksl_lower_bound(&encoder->blocked_streams, &bsk);
2271 nghttp3_ksl_remove_hint(&encoder->blocked_streams, &it, &it, &bsk);
2275 int nghttp3_qpack_encoder_ack_header(nghttp3_qpack_encoder *encoder,
2278 nghttp3_qpack_encoder_find_stream(encoder, stream_id);
2279 const nghttp3_mem *mem = encoder->ctx.mem;
2291 DEBUGF("qpack::encoder: Header acknowledgement stream=%ld ricnt=%" PRIu64
2293 stream_id, ref->max_cnt, encoder->krcnt);
2295 if (encoder->krcnt < ref->max_cnt) {
2296 encoder->krcnt = ref->max_cnt;
2298 nghttp3_qpack_encoder_unblock(encoder, ref->max_cnt);
2305 nghttp3_pq_remove(&encoder->min_cnts, &ref->min_cnts_pe);
2313 qpack_encoder_remove_stream(encoder, stream);
2320 int nghttp3_qpack_encoder_add_icnt(nghttp3_qpack_encoder *encoder, uint64_t n) {
2321 if (n == 0 || encoder->ctx.next_absidx - encoder->krcnt < n) {
2324 encoder->krcnt += n;
2326 nghttp3_qpack_encoder_unblock(encoder, encoder->krcnt);
2331 void nghttp3_qpack_encoder_ack_everything(nghttp3_qpack_encoder *encoder) {
2332 encoder->krcnt = encoder->ctx.next_absidx;
2334 nghttp3_ksl_clear(&encoder->blocked_streams);
2335 nghttp3_pq_clear(&encoder->min_cnts);
2336 nghttp3_map_each_free(&encoder->streams, map_stream_free,
2337 (void *)encoder->ctx.mem);
2338 nghttp3_map_clear(&encoder->streams);
2341 void nghttp3_qpack_encoder_cancel_stream(nghttp3_qpack_encoder *encoder,
2344 nghttp3_qpack_encoder_find_stream(encoder, stream_id);
2345 const nghttp3_mem *mem = encoder->ctx.mem;
2351 if (nghttp3_qpack_encoder_stream_is_blocked(encoder, stream)) {
2352 nghttp3_qpack_encoder_unblock_stream(encoder, stream);
2355 qpack_encoder_remove_stream(encoder, stream);
2361 nghttp3_qpack_encoder_get_num_blocked_streams(nghttp3_qpack_encoder *encoder) {
2362 return nghttp3_ksl_len(&encoder->blocked_streams);
2366 nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt,
2369 encoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD;
2379 ricnt, base, encoder->ctx.next_absidx);
2381 rv = reserve_buf(pbuf, len, encoder->ctx.mem);
2486 nghttp3_ssize nghttp3_qpack_encoder_read_decoder(nghttp3_qpack_encoder *encoder,
2494 if (encoder->ctx.bad) {
2505 switch (encoder->state) {
2509 encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_SECTION_ACK;
2510 encoder->rstate.prefix = 7;
2513 encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_STREAM_CANCEL;
2514 encoder->rstate.prefix = 6;
2517 encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_ICNT_INCREMENT;
2518 encoder->rstate.prefix = 6;
2520 encoder->state = NGHTTP3_QPACK_DS_STATE_READ_NUMBER;
2523 nread = qpack_read_varint(&rfin, &encoder->rstate, p, end);
2536 switch (encoder->opcode) {
2538 rv = nghttp3_qpack_encoder_add_icnt(encoder, encoder->rstate.left);
2544 rv = nghttp3_qpack_encoder_ack_header(encoder,
2545 (int64_t)encoder->rstate.left);
2551 nghttp3_qpack_encoder_cancel_stream(encoder,
2552 (int64_t)encoder->rstate.left);
2560 encoder->state = NGHTTP3_QPACK_DS_STATE_OPCODE;
2561 nghttp3_qpack_read_state_reset(&encoder->rstate);
2573 encoder->ctx.bad = 1;
3941 /* A broken encoder might change dtable capacity while processing
4020 void nghttp3_qpack_encoder_del(nghttp3_qpack_encoder *encoder) {
4023 if (encoder == NULL) {
4027 mem = encoder->ctx.mem;
4029 nghttp3_qpack_encoder_free(encoder);
4030 nghttp3_mem_free(mem, encoder);