blob: eddb99ee1cead125a804fc74b33737adeb3f9d3f [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
David Garcia Quintas3598d442016-03-15 14:53:05 -07003 * Copyright 2015-2016, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Craig Tiller9a4dddd2016-03-25 17:08:13 -070034#ifndef GRPC_CORE_LIB_TRANSPORT_CHTTP2_HPACK_TABLE_H
35#define GRPC_CORE_LIB_TRANSPORT_CHTTP2_HPACK_TABLE_H
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080037#include <grpc/support/port_platform.h>
38#include <grpc/support/slice.h>
Craig Tillerf40df232016-03-25 13:38:14 -070039#include "src/core/transport/metadata.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040
41/* HPACK header table */
42
43/* last index in the static table */
44#define GRPC_CHTTP2_LAST_STATIC_ENTRY 61
45
46/* Initial table size as per the spec */
47#define GRPC_CHTTP2_INITIAL_HPACK_TABLE_SIZE 4096
48/* Maximum table size that we'll use */
49#define GRPC_CHTTP2_MAX_HPACK_TABLE_SIZE GRPC_CHTTP2_INITIAL_HPACK_TABLE_SIZE
50/* Per entry overhead bytes as per the spec */
51#define GRPC_CHTTP2_HPACK_ENTRY_OVERHEAD 32
Craig Tiller027a74c2015-11-10 08:37:46 +000052#if 0
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080053/* Maximum number of entries we could possibly fit in the table, given defined
54 overheads */
55#define GRPC_CHTTP2_MAX_TABLE_COUNT \
56 ((GRPC_CHTTP2_MAX_HPACK_TABLE_SIZE + GRPC_CHTTP2_HPACK_ENTRY_OVERHEAD - 1) / \
57 GRPC_CHTTP2_HPACK_ENTRY_OVERHEAD)
Craig Tiller027a74c2015-11-10 08:37:46 +000058#endif
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080059
60/* hpack decoder table */
61typedef struct {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080062 /* the first used entry in ents */
Craig Tiller7536af02015-12-22 13:49:30 -080063 uint32_t first_ent;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080064 /* how many entries are in the table */
Craig Tiller7536af02015-12-22 13:49:30 -080065 uint32_t num_ents;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080066 /* the amount of memory used by the table, according to the hpack algorithm */
Craig Tiller7536af02015-12-22 13:49:30 -080067 uint32_t mem_used;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080068 /* the max memory allowed to be used by the table, according to the hpack
69 algorithm */
Craig Tiller7536af02015-12-22 13:49:30 -080070 uint32_t max_bytes;
Craig Tiller027a74c2015-11-10 08:37:46 +000071 /* the currently agreed size of the table, according to the hpack algorithm */
Craig Tiller7536af02015-12-22 13:49:30 -080072 uint32_t current_table_bytes;
Craig Tiller027a74c2015-11-10 08:37:46 +000073 /* Maximum number of entries we could possibly fit in the table, given defined
74 overheads */
Craig Tiller7536af02015-12-22 13:49:30 -080075 uint32_t max_entries;
Craig Tiller027a74c2015-11-10 08:37:46 +000076 /* Number of entries allocated in ents */
Craig Tiller7536af02015-12-22 13:49:30 -080077 uint32_t cap_entries;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080078 /* a circular buffer of headers - this is stored in the opposite order to
79 what hpack specifies, in order to simplify table management a little...
80 meaning lookups need to SUBTRACT from the end position */
Craig Tiller027a74c2015-11-10 08:37:46 +000081 grpc_mdelem **ents;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080082 grpc_mdelem *static_ents[GRPC_CHTTP2_LAST_STATIC_ENTRY];
83} grpc_chttp2_hptbl;
84
85/* initialize a hpack table */
Craig Tillerb2b42612015-11-20 12:02:17 -080086void grpc_chttp2_hptbl_init(grpc_chttp2_hptbl *tbl);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080087void grpc_chttp2_hptbl_destroy(grpc_chttp2_hptbl *tbl);
Craig Tiller3c53bb22015-11-10 14:24:36 +000088void grpc_chttp2_hptbl_set_max_bytes(grpc_chttp2_hptbl *tbl,
Craig Tiller7536af02015-12-22 13:49:30 -080089 uint32_t max_bytes);
Craig Tiller3c53bb22015-11-10 14:24:36 +000090int grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl *tbl,
Craig Tiller7536af02015-12-22 13:49:30 -080091 uint32_t bytes);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080092
93/* lookup a table entry based on its hpack index */
94grpc_mdelem *grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl *tbl,
Craig Tiller7536af02015-12-22 13:49:30 -080095 uint32_t index);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080096/* add a table entry to the index */
Craig Tiller3c53bb22015-11-10 14:24:36 +000097int grpc_chttp2_hptbl_add(grpc_chttp2_hptbl *tbl,
98 grpc_mdelem *md) GRPC_MUST_USE_RESULT;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080099/* Find a key/value pair in the table... returns the index in the table of the
100 most similar entry, or 0 if the value was not found */
101typedef struct {
Craig Tiller7536af02015-12-22 13:49:30 -0800102 uint32_t index;
Craig Tiller027a74c2015-11-10 08:37:46 +0000103 int has_value;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800104} grpc_chttp2_hptbl_find_result;
105grpc_chttp2_hptbl_find_result grpc_chttp2_hptbl_find(
106 const grpc_chttp2_hptbl *tbl, grpc_mdelem *md);
107
Craig Tiller9a4dddd2016-03-25 17:08:13 -0700108#endif /* GRPC_CORE_LIB_TRANSPORT_CHTTP2_HPACK_TABLE_H */