Skip to content

Commit 5130dab

Browse files
Call tfw_http_hdr_split only during hpack encoding
Previously we call `tfw_http_hdr_split` twice - in `tfw_hpack_encoder_index` and in `tfw_hpack_hdr_add`, this patch fixes this behaviour, we split header at the beginning of `__tfw_hpack_encode` if it is necessary and use header name and header value later.
1 parent d8e5920 commit 5130dab

File tree

2 files changed

+119
-105
lines changed

2 files changed

+119
-105
lines changed

fw/hpack.c

Lines changed: 48 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3026,19 +3026,17 @@ tfw_hpack_rbuf_commit(TfwHPackETbl *__restrict tbl,
30263026
* headers will be evicted from the index table.
30273027
*/
30283028
static int
3029-
tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
3030-
TfwHPackNodeIter *__restrict place, bool spcolon)
3029+
tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict h_name,
3030+
TfwStr *__restrict h_val, TfwHPackNodeIter *__restrict place)
30313031
{
30323032
char *ptr;
30333033
unsigned long node_size, hdr_len;
30343034
unsigned short new_size, node_len;
30353035
unsigned short cur_size = tbl->size, window = tbl->window;
30363036
TfwHPackNode *del_list[HPACK_MAX_ENC_EVICTION] = {};
3037-
TfwStr s_nm = {}, s_val = {};
30383037
TfwHPackETblIter it = {};
30393038

3040-
hdr_len = tfw_http_hdr_split(hdr, &s_nm, &s_val, spcolon);
3041-
WARN_ON_ONCE(TFW_STR_EMPTY(&s_nm));
3039+
hdr_len = h_name->len + h_val->len;
30423040

30433041
WARN_ON_ONCE(cur_size > window || window > HPACK_ENC_TABLE_MAX_SIZE);
30443042
if ((node_size = hdr_len + HPACK_ENTRY_OVERHEAD) > window) {
@@ -3131,14 +3129,14 @@ tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
31313129
it.size += node_size;
31323130
it.rb_len += node_len;
31333131
it.last->hdr_len = hdr_len;
3134-
it.last->name_len = s_nm.len;
3132+
it.last->name_len = h_name->len;
31353133
it.last->rindex = ++tbl->idx_acc;
31363134

3137-
tfw_hpack_rbuf_commit(tbl, &s_nm, &s_val, del_list, place, &it);
3135+
tfw_hpack_rbuf_commit(tbl, h_name, h_val, del_list, place, &it);
31383136

3139-
ptr = tfw_hpack_write(&s_nm, it.last->hdr);
3140-
if (!TFW_STR_EMPTY(&s_val))
3141-
tfw_hpack_write(&s_val, ptr);
3137+
ptr = tfw_hpack_write(h_name, it.last->hdr);
3138+
if (!TFW_STR_EMPTY(h_val))
3139+
tfw_hpack_write(h_val, ptr);
31423140

31433141
WARN_ON_ONCE(tbl->rb_len > tbl->size);
31443142

@@ -3150,36 +3148,28 @@ tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
31503148
* encoder dynamic table with potentially concurrent access from different
31513149
* threads, so lock is used to protect the find/add/erase operations inside
31523150
* this procedure.
3153-
*
3154-
* TODO #1411: get rid of tfw_http_hdr_split and related safety checks
31553151
*/
31563152
static TfwHPackETblRes
31573153
tfw_hpack_encoder_index(TfwHPackETbl *__restrict tbl,
3158-
TfwStr *__restrict hdr,
3154+
TfwStr *__restrict h_name,
3155+
TfwStr *__restrict h_val,
31593156
unsigned short *__restrict out_index,
3160-
unsigned long *__restrict flags,
3161-
bool spcolon)
3157+
unsigned long *__restrict flags)
31623158
{
31633159
TfwHPackNodeIter place = {};
31643160
const TfwHPackNode *node = NULL;
31653161
TfwHPackETblRes res = HPACK_IDX_ST_NOT_FOUND;
3166-
TfwStr h_name = {}, h_val = {};
31673162

31683163
BUILD_BUG_ON(HPACK_IDX_ST_MASK < _HPACK_IDX_ST_NUM - 1);
3169-
if (WARN_ON_ONCE(!hdr))
3170-
return -EINVAL;
31713164

3172-
tfw_http_hdr_split(hdr, &h_name, &h_val, spcolon);
3173-
if (WARN_ON_ONCE(TFW_STR_EMPTY(&h_name)))
3174-
return -EINVAL;
3175-
res = tfw_hpack_rbtree_find(tbl, &h_name, &h_val, &node, &place);
3165+
res = tfw_hpack_rbtree_find(tbl, h_name, h_val, &node, &place);
31763166

31773167
WARN_ON_ONCE(!node && res != HPACK_IDX_ST_NOT_FOUND);
31783168

31793169
*out_index = HPACK_NODE_GET_INDEX(tbl, node);
31803170

31813171
if(res != HPACK_IDX_ST_FOUND
3182-
&& !tfw_hpack_add_node(tbl, hdr, &place, spcolon))
3172+
&& !tfw_hpack_add_node(tbl, h_name, h_val, &place))
31833173
res |= HPACK_IDX_FLAG_ADD;
31843174

31853175
return res;
@@ -3424,31 +3414,23 @@ tfw_hpack_write_idx(TfwHttpResp *__restrict resp, TfwHPackInt *__restrict idx,
34243414
* response @resp using @resp->pool.
34253415
*/
34263416
static int
3427-
tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3428-
TfwHPackInt *__restrict idx, bool name_indexed, bool trans)
3417+
tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict h_name,
3418+
TfwStr *__restrict h_val, TfwHPackInt *__restrict idx,
3419+
bool name_indexed, bool trans)
34293420
{
34303421
int r;
34313422
TfwHPackInt vlen;
3432-
TfwStr s_name = {}, s_val = {}, s_vlen = {};
3433-
3434-
if (!hdr)
3435-
return -EINVAL;
3423+
TfwStr s_vlen = {};
34363424

34373425
r = tfw_hpack_write_idx(resp, idx, true);
34383426
if (unlikely(r))
34393427
return r;
34403428

3441-
if (WARN_ON_ONCE(TFW_STR_PLAIN(hdr) || TFW_STR_DUP(hdr)))
3442-
return -EINVAL;
3443-
3444-
if (!tfw_http_hdr_split(hdr, &s_name, &s_val, trans))
3445-
return -EINVAL;
3446-
34473429
if (unlikely(!name_indexed)) {
34483430
TfwHPackInt nlen;
34493431
TfwStr s_nlen = {};
34503432

3451-
write_int(s_name.len, 0x7F, 0, &nlen);
3433+
write_int(h_name->len, 0x7F, 0, &nlen);
34523434
s_nlen.data = nlen.buf;
34533435
s_nlen.len = nlen.sz;
34543436

@@ -3457,23 +3439,23 @@ tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
34573439
return r;
34583440

34593441
if (trans)
3460-
r = tfw_http_msg_expand_from_pool_lc(resp, &s_name);
3442+
r = tfw_http_msg_expand_from_pool_lc(resp, h_name);
34613443
else
3462-
r = tfw_http_msg_expand_from_pool(resp, &s_name);
3444+
r = tfw_http_msg_expand_from_pool(resp, h_name);
34633445
if (unlikely(r))
34643446
return r;
34653447
}
34663448

3467-
write_int(s_val.len, 0x7F, 0, &vlen);
3449+
write_int(h_val->len, 0x7F, 0, &vlen);
34683450
s_vlen.data = vlen.buf;
34693451
s_vlen.len = vlen.sz;
34703452

34713453
r = tfw_http_msg_expand_from_pool(resp, &s_vlen);
3472-
34733454
if (unlikely(r))
34743455
return r;
3475-
if (!TFW_STR_EMPTY(&s_val))
3476-
r = tfw_http_msg_expand_from_pool(resp, &s_val);
3456+
3457+
if (!TFW_STR_EMPTY(h_val))
3458+
r = tfw_http_msg_expand_from_pool(resp, h_val);
34773459

34783460
return r;
34793461
}
@@ -3565,6 +3547,15 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
35653547
TfwHPackETbl *tbl = &ctx->hpack.enc_tbl;
35663548
int r = HPACK_IDX_ST_NOT_FOUND;
35673549
bool name_indexed = true;
3550+
TfwStr h_name = {}, h_val = {};
3551+
3552+
#define __HDR_SPLIT(hdr) \
3553+
do { \
3554+
if (unlikely(TFW_STR_PLAIN(hdr) || TFW_STR_DUP(hdr) \
3555+
|| !tfw_http_hdr_split(hdr, &h_name, &h_val, trans) \
3556+
|| TFW_STR_EMPTY(&h_name))) \
3557+
return -EINVAL; \
3558+
} while(0)
35683559

35693560
if (WARN_ON_ONCE(!hdr || TFW_STR_EMPTY(hdr)))
35703561
return -EINVAL;
@@ -3577,13 +3568,16 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
35773568
T_DBG_PRINT_HPACK_RBTREE(tbl);
35783569

35793570
if (!st_full_index && dyn_indexing) {
3571+
__HDR_SPLIT(hdr);
35803572
assert_spin_locked(&conn->sk->sk_lock.slock);
3581-
r = tfw_hpack_encoder_index(tbl, hdr, &index, resp->flags,
3582-
trans);
3573+
r = tfw_hpack_encoder_index(tbl, &h_name, &h_val,
3574+
&index, resp->flags);
35833575
if (r < 0)
35843576
return r;
35853577
}
35863578

3579+
if (TFW_STR_PLAIN(hdr))
3580+
35873581
if (st_full_index || HPACK_IDX_RES(r) == HPACK_IDX_ST_FOUND) {
35883582
/*
35893583
* The full index (whether static or dynamic) always takes
@@ -3631,11 +3625,18 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
36313625
name_indexed = false;
36323626

36333627
encode:
3634-
if (use_pool)
3635-
r = tfw_hpack_hdr_add(resp, hdr, &idx, name_indexed, trans);
3636-
else
3628+
if (use_pool) {
3629+
if (!dyn_indexing)
3630+
__HDR_SPLIT(hdr);
3631+
r = tfw_hpack_hdr_add(resp, &h_name, &h_val, &idx,
3632+
name_indexed, trans);
3633+
} else {
36373634
r = tfw_hpack_hdr_expand(resp, hdr, &idx, name_indexed);
3635+
}
3636+
36383637
return r;
3638+
3639+
#undef __HDR_SPLIT
36393640
}
36403641

36413642
int

0 commit comments

Comments
 (0)