Skip to content

Commit 8115185

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 af8e456 commit 8115185

File tree

4 files changed

+93
-64
lines changed

4 files changed

+93
-64
lines changed

fw/hpack.c

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3021,19 +3021,17 @@ tfw_hpack_rbuf_commit(TfwHPackETbl *__restrict tbl,
30213021
* headers will be evicted from the index table.
30223022
*/
30233023
static int
3024-
tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
3025-
TfwHPackNodeIter *__restrict place, bool spcolon)
3024+
tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict h_name,
3025+
TfwStr *__restrict h_val, TfwHPackNodeIter *__restrict place)
30263026
{
30273027
char *ptr;
30283028
unsigned long node_size, hdr_len;
30293029
unsigned short new_size, node_len;
30303030
unsigned short cur_size = tbl->size, window = tbl->window;
30313031
TfwHPackNode *del_list[HPACK_MAX_ENC_EVICTION] = {};
3032-
TfwStr s_nm = {}, s_val = {};
30333032
TfwHPackETblIter it = {};
30343033

3035-
hdr_len = tfw_http_hdr_split(hdr, &s_nm, &s_val, spcolon);
3036-
WARN_ON_ONCE(TFW_STR_EMPTY(&s_nm));
3034+
hdr_len = h_name->len + h_val->len;
30373035

30383036
WARN_ON_ONCE(cur_size > window || window > HPACK_ENC_TABLE_MAX_SIZE);
30393037
if ((node_size = hdr_len + HPACK_ENTRY_OVERHEAD) > window) {
@@ -3126,14 +3124,14 @@ tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
31263124
it.size += node_size;
31273125
it.rb_len += node_len;
31283126
it.last->hdr_len = hdr_len;
3129-
it.last->name_len = s_nm.len;
3127+
it.last->name_len = h_name->len;
31303128
it.last->rindex = ++tbl->idx_acc;
31313129

3132-
tfw_hpack_rbuf_commit(tbl, &s_nm, &s_val, del_list, place, &it);
3130+
tfw_hpack_rbuf_commit(tbl, h_name, h_val, del_list, place, &it);
31333131

3134-
ptr = tfw_hpack_write(&s_nm, it.last->hdr);
3135-
if (!TFW_STR_EMPTY(&s_val))
3136-
tfw_hpack_write(&s_val, ptr);
3132+
ptr = tfw_hpack_write(h_name, it.last->hdr);
3133+
if (!TFW_STR_EMPTY(h_val))
3134+
tfw_hpack_write(h_val, ptr);
31373135

31383136
WARN_ON_ONCE(tbl->rb_len > tbl->size);
31393137

@@ -3145,36 +3143,28 @@ tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
31453143
* encoder dynamic table with potentially concurrent access from different
31463144
* threads, so lock is used to protect the find/add/erase operations inside
31473145
* this procedure.
3148-
*
3149-
* TODO #1411: get rid of tfw_http_hdr_split and related safety checks
31503146
*/
31513147
static TfwHPackETblRes
31523148
tfw_hpack_encoder_index(TfwHPackETbl *__restrict tbl,
3153-
TfwStr *__restrict hdr,
3149+
TfwStr *__restrict h_name,
3150+
TfwStr *__restrict h_val,
31543151
unsigned short *__restrict out_index,
3155-
unsigned long *__restrict flags,
3156-
bool spcolon)
3152+
unsigned long *__restrict flags)
31573153
{
31583154
TfwHPackNodeIter place = {};
31593155
const TfwHPackNode *node = NULL;
31603156
TfwHPackETblRes res = HPACK_IDX_ST_NOT_FOUND;
3161-
TfwStr h_name = {}, h_val = {};
31623157

31633158
BUILD_BUG_ON(HPACK_IDX_ST_MASK < _HPACK_IDX_ST_NUM - 1);
3164-
if (WARN_ON_ONCE(!hdr))
3165-
return -EINVAL;
31663159

3167-
tfw_http_hdr_split(hdr, &h_name, &h_val, spcolon);
3168-
if (WARN_ON_ONCE(TFW_STR_EMPTY(&h_name)))
3169-
return -EINVAL;
3170-
res = tfw_hpack_rbtree_find(tbl, &h_name, &h_val, &node, &place);
3160+
res = tfw_hpack_rbtree_find(tbl, h_name, h_val, &node, &place);
31713161

31723162
WARN_ON_ONCE(!node && res != HPACK_IDX_ST_NOT_FOUND);
31733163

31743164
*out_index = HPACK_NODE_GET_INDEX(tbl, node);
31753165

31763166
if(res != HPACK_IDX_ST_FOUND
3177-
&& !tfw_hpack_add_node(tbl, hdr, &place, spcolon))
3167+
&& !tfw_hpack_add_node(tbl, h_name, h_val, &place))
31783168
res |= HPACK_IDX_FLAG_ADD;
31793169

31803170
return res;
@@ -3419,31 +3409,23 @@ tfw_hpack_write_idx(TfwHttpResp *__restrict resp, TfwHPackInt *__restrict idx,
34193409
* response @resp using @resp->pool.
34203410
*/
34213411
static int
3422-
tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3423-
TfwHPackInt *__restrict idx, bool name_indexed, bool trans)
3412+
tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict h_name,
3413+
TfwStr *__restrict h_val, TfwHPackInt *__restrict idx,
3414+
bool name_indexed, bool trans)
34243415
{
34253416
int r;
34263417
TfwHPackInt vlen;
3427-
TfwStr s_name = {}, s_val = {}, s_vlen = {};
3428-
3429-
if (!hdr)
3430-
return -EINVAL;
3418+
TfwStr s_vlen = {};
34313419

34323420
r = tfw_hpack_write_idx(resp, idx, true);
34333421
if (unlikely(r))
34343422
return r;
34353423

3436-
if (WARN_ON_ONCE(TFW_STR_PLAIN(hdr) || TFW_STR_DUP(hdr)))
3437-
return -EINVAL;
3438-
3439-
if (!tfw_http_hdr_split(hdr, &s_name, &s_val, trans))
3440-
return -EINVAL;
3441-
34423424
if (unlikely(!name_indexed)) {
34433425
TfwHPackInt nlen;
34443426
TfwStr s_nlen = {};
34453427

3446-
write_int(s_name.len, 0x7F, 0, &nlen);
3428+
write_int(h_name->len, 0x7F, 0, &nlen);
34473429
s_nlen.data = nlen.buf;
34483430
s_nlen.len = nlen.sz;
34493431

@@ -3452,23 +3434,23 @@ tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
34523434
return r;
34533435

34543436
if (trans)
3455-
r = tfw_http_msg_expand_from_pool_lc(resp, &s_name);
3437+
r = tfw_http_msg_expand_from_pool_lc(resp, h_name);
34563438
else
3457-
r = tfw_http_msg_expand_from_pool(resp, &s_name);
3439+
r = tfw_http_msg_expand_from_pool(resp, h_name);
34583440
if (unlikely(r))
34593441
return r;
34603442
}
34613443

3462-
write_int(s_val.len, 0x7F, 0, &vlen);
3444+
write_int(h_val->len, 0x7F, 0, &vlen);
34633445
s_vlen.data = vlen.buf;
34643446
s_vlen.len = vlen.sz;
34653447

34663448
r = tfw_http_msg_expand_from_pool(resp, &s_vlen);
3467-
34683449
if (unlikely(r))
34693450
return r;
3470-
if (!TFW_STR_EMPTY(&s_val))
3471-
r = tfw_http_msg_expand_from_pool(resp, &s_val);
3451+
3452+
if (!TFW_STR_EMPTY(h_val))
3453+
r = tfw_http_msg_expand_from_pool(resp, h_val);
34723454

34733455
return r;
34743456
}
@@ -3560,6 +3542,15 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
35603542
TfwHPackETbl *tbl = &ctx->hpack.enc_tbl;
35613543
int r = HPACK_IDX_ST_NOT_FOUND;
35623544
bool name_indexed = true;
3545+
TfwStr h_name = {}, h_val = {};
3546+
3547+
#define __HDR_SPLIT(hdr) \
3548+
do { \
3549+
if (unlikely(TFW_STR_PLAIN(hdr) || TFW_STR_DUP(hdr) \
3550+
|| !tfw_http_hdr_split(hdr, &h_name, &h_val, trans) \
3551+
|| TFW_STR_EMPTY(&h_name))) \
3552+
return -EINVAL; \
3553+
} while(0)
35633554

35643555
if (WARN_ON_ONCE(!hdr || TFW_STR_EMPTY(hdr)))
35653556
return -EINVAL;
@@ -3572,9 +3563,10 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
35723563
T_DBG_PRINT_HPACK_RBTREE(tbl);
35733564

35743565
if (!st_full_index && dyn_indexing) {
3566+
__HDR_SPLIT(hdr);
35753567
assert_spin_locked(&conn->sk->sk_lock.slock);
3576-
r = tfw_hpack_encoder_index(tbl, hdr, &index, resp->flags,
3577-
trans);
3568+
r = tfw_hpack_encoder_index(tbl, &h_name, &h_val,
3569+
&index, resp->flags);
35783570
if (r < 0)
35793571
return r;
35803572
}
@@ -3626,11 +3618,18 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
36263618
name_indexed = false;
36273619

36283620
encode:
3629-
if (use_pool)
3630-
r = tfw_hpack_hdr_add(resp, hdr, &idx, name_indexed, trans);
3631-
else
3621+
if (use_pool) {
3622+
if (!dyn_indexing)
3623+
__HDR_SPLIT(hdr);
3624+
r = tfw_hpack_hdr_add(resp, &h_name, &h_val, &idx,
3625+
name_indexed, trans);
3626+
} else {
36323627
r = tfw_hpack_hdr_expand(resp, hdr, &idx, name_indexed);
3628+
}
3629+
36333630
return r;
3631+
3632+
#undef __HDR_SPLIT
36343633
}
36353634

36363635
int

fw/str.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,24 +1367,24 @@ tfw_str_crc32_calc(const TfwStr *str)
13671367
return crc;
13681368
}
13691369

1370-
#ifdef DEBUG
13711370
void
13721371
tfw_str_dprint(const TfwStr *str, const char *msg)
13731372
{
13741373
const TfwStr *dup, *dup_end, *c, *chunk_end;
13751374

1376-
T_DBG("%s: addr=%p skb=%p len=%lu flags=%x eolen=%u:\n", msg,
1375+
printk(KERN_ALERT "%s: addr=%p skb=%p len=%lu flags=%x eolen=%u:\n", msg,
13771376
str, str->skb, str->len, str->flags, str->eolen);
13781377
TFW_STR_FOR_EACH_DUP(dup, str, dup_end) {
1379-
T_DBG(" duplicate %p, len=%lu, flags=%x eolen=%u:\n",
1378+
printk(KERN_ALERT " duplicate %p, len=%lu, flags=%x eolen=%u:\n",
13801379
dup, dup->len, dup->flags, dup->eolen);
13811380
TFW_STR_FOR_EACH_CHUNK(c, dup, chunk_end)
1382-
T_DBG(" len=%lu, eolen=%u ptr=%p flags=%x '%.*s'\n",
1381+
printk(KERN_ALERT " len=%lu, eolen=%u ptr=%p flags=%x '%.*s'\n",
13831382
c->len, c->eolen, c->data, c->flags,
13841383
(int)c->len, c->data);
13851384
}
13861385
}
13871386

1387+
#ifdef DEBUG
13881388
#define D(n) (unsigned int)v[n]
13891389

13901390
void

fw/str.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,8 @@ size_t tfw_str_to_cstr(const TfwStr *str, char *out_buf, int buf_size);
478478
TfwStr tfw_str_next_str_val(const TfwStr *str);
479479
u32 tfw_str_crc32_calc(const TfwStr *str);
480480

481-
#ifdef DEBUG
482481
void tfw_str_dprint(const TfwStr *str, const char *msg);
482+
#ifdef DEBUG
483483
void tfw_dbg_vprint32(const char *prefix, const unsigned char *v);
484484
#endif
485485

0 commit comments

Comments
 (0)