Lines Matching refs:strp
15 static void tls_strp_abort_strp(struct tls_strparser *strp, int err) in tls_strp_abort_strp() argument
17 if (strp->stopped) in tls_strp_abort_strp()
20 strp->stopped = 1; in tls_strp_abort_strp()
23 strp->sk->sk_err = -err; in tls_strp_abort_strp()
24 sk_error_report(strp->sk); in tls_strp_abort_strp()
27 static void tls_strp_anchor_free(struct tls_strparser *strp) in tls_strp_anchor_free() argument
29 struct skb_shared_info *shinfo = skb_shinfo(strp->anchor); in tls_strp_anchor_free()
33 consume_skb(strp->anchor); in tls_strp_anchor_free()
34 strp->anchor = NULL; in tls_strp_anchor_free()
38 static struct sk_buff *tls_strp_msg_make_copy(struct tls_strparser *strp) in tls_strp_msg_make_copy() argument
44 skb = alloc_skb_with_frags(0, strp->stm.full_len, TLS_PAGE_ORDER, in tls_strp_msg_make_copy()
45 &err, strp->sk->sk_allocation); in tls_strp_msg_make_copy()
49 offset = strp->stm.offset; in tls_strp_msg_make_copy()
53 WARN_ON_ONCE(skb_copy_bits(strp->anchor, offset, in tls_strp_msg_make_copy()
59 skb_copy_header(skb, strp->anchor); in tls_strp_msg_make_copy()
68 struct tls_strparser *strp = &ctx->strp; in tls_strp_msg_detach() local
71 DEBUG_NET_WARN_ON_ONCE(!strp->anchor->decrypted); in tls_strp_msg_detach()
79 if (strp->copy_mode) { in tls_strp_msg_detach()
86 skb = alloc_skb(0, strp->sk->sk_allocation); in tls_strp_msg_detach()
90 swap(strp->anchor, skb); in tls_strp_msg_detach()
94 return tls_strp_msg_make_copy(strp); in tls_strp_msg_detach()
103 struct tls_strparser *strp = &ctx->strp; in tls_strp_msg_cow() local
106 if (strp->copy_mode) in tls_strp_msg_cow()
109 skb = tls_strp_msg_make_copy(strp); in tls_strp_msg_cow()
113 tls_strp_anchor_free(strp); in tls_strp_msg_cow()
114 strp->anchor = skb; in tls_strp_msg_cow()
116 tcp_read_done(strp->sk, strp->stm.full_len); in tls_strp_msg_cow()
117 strp->copy_mode = 1; in tls_strp_msg_cow()
126 int tls_strp_msg_hold(struct tls_strparser *strp, struct sk_buff_head *dst) in tls_strp_msg_hold() argument
128 struct skb_shared_info *shinfo = skb_shinfo(strp->anchor); in tls_strp_msg_hold()
130 if (strp->copy_mode) { in tls_strp_msg_hold()
136 skb = alloc_skb(0, strp->sk->sk_allocation); in tls_strp_msg_hold()
140 __skb_queue_tail(dst, strp->anchor); in tls_strp_msg_hold()
141 strp->anchor = skb; in tls_strp_msg_hold()
146 offset = strp->stm.offset; in tls_strp_msg_hold()
147 len = strp->stm.full_len; in tls_strp_msg_hold()
159 clone = skb_clone(iter, strp->sk->sk_allocation); in tls_strp_msg_hold()
173 static void tls_strp_flush_anchor_copy(struct tls_strparser *strp) in tls_strp_flush_anchor_copy() argument
175 struct skb_shared_info *shinfo = skb_shinfo(strp->anchor); in tls_strp_flush_anchor_copy()
183 strp->copy_mode = 0; in tls_strp_flush_anchor_copy()
189 struct tls_strparser *strp = (struct tls_strparser *)desc->arg.data; in tls_strp_copyin() local
195 if (strp->msg_ready) in tls_strp_copyin()
198 skb = strp->anchor; in tls_strp_copyin()
203 if (!strp->stm.full_len) { in tls_strp_copyin()
211 sz = tls_rx_msg_size(strp, strp->anchor); in tls_strp_copyin()
228 strp->stm.full_len = sz; in tls_strp_copyin()
229 if (!strp->stm.full_len) in tls_strp_copyin()
234 while (len && strp->stm.full_len > skb->len) { in tls_strp_copyin()
235 chunk = min_t(size_t, len, strp->stm.full_len - skb->len); in tls_strp_copyin()
250 if (strp->stm.full_len == skb->len) { in tls_strp_copyin()
253 strp->msg_ready = 1; in tls_strp_copyin()
254 tls_rx_msg_ready(strp); in tls_strp_copyin()
261 static int tls_strp_read_copyin(struct tls_strparser *strp) in tls_strp_read_copyin() argument
263 struct socket *sock = strp->sk->sk_socket; in tls_strp_read_copyin()
266 desc.arg.data = strp; in tls_strp_read_copyin()
271 sock->ops->read_sock(strp->sk, &desc, tls_strp_copyin); in tls_strp_read_copyin()
276 static int tls_strp_read_copy(struct tls_strparser *strp, bool qshort) in tls_strp_read_copy() argument
286 if (likely(qshort && !tcp_epollin_ready(strp->sk, INT_MAX))) in tls_strp_read_copy()
289 shinfo = skb_shinfo(strp->anchor); in tls_strp_read_copy()
293 need_spc = strp->stm.full_len ?: TLS_MAX_PAYLOAD_SIZE + PAGE_SIZE; in tls_strp_read_copy()
296 page = alloc_page(strp->sk->sk_allocation); in tls_strp_read_copy()
298 tls_strp_flush_anchor_copy(strp); in tls_strp_read_copy()
302 skb_fill_page_desc(strp->anchor, shinfo->nr_frags++, in tls_strp_read_copy()
306 strp->copy_mode = 1; in tls_strp_read_copy()
307 strp->stm.offset = 0; in tls_strp_read_copy()
309 strp->anchor->len = 0; in tls_strp_read_copy()
310 strp->anchor->data_len = 0; in tls_strp_read_copy()
311 strp->anchor->truesize = round_up(need_spc, PAGE_SIZE); in tls_strp_read_copy()
313 tls_strp_read_copyin(strp); in tls_strp_read_copy()
318 static bool tls_strp_check_no_dup(struct tls_strparser *strp) in tls_strp_check_no_dup() argument
320 unsigned int len = strp->stm.offset + strp->stm.full_len; in tls_strp_check_no_dup()
324 skb = skb_shinfo(strp->anchor)->frag_list; in tls_strp_check_no_dup()
339 static void tls_strp_load_anchor_with_queue(struct tls_strparser *strp, int len) in tls_strp_load_anchor_with_queue() argument
341 struct tcp_sock *tp = tcp_sk(strp->sk); in tls_strp_load_anchor_with_queue()
345 first = tcp_recv_skb(strp->sk, tp->copied_seq, &offset); in tls_strp_load_anchor_with_queue()
350 strp->anchor->len = offset + len; in tls_strp_load_anchor_with_queue()
351 strp->anchor->data_len = offset + len; in tls_strp_load_anchor_with_queue()
352 strp->anchor->truesize = offset + len; in tls_strp_load_anchor_with_queue()
354 skb_shinfo(strp->anchor)->frag_list = first; in tls_strp_load_anchor_with_queue()
356 skb_copy_header(strp->anchor, first); in tls_strp_load_anchor_with_queue()
357 strp->anchor->destructor = NULL; in tls_strp_load_anchor_with_queue()
359 strp->stm.offset = offset; in tls_strp_load_anchor_with_queue()
362 void tls_strp_msg_load(struct tls_strparser *strp, bool force_refresh) in tls_strp_msg_load() argument
367 DEBUG_NET_WARN_ON_ONCE(!strp->msg_ready); in tls_strp_msg_load()
368 DEBUG_NET_WARN_ON_ONCE(!strp->stm.full_len); in tls_strp_msg_load()
370 if (!strp->copy_mode && force_refresh) { in tls_strp_msg_load()
371 if (WARN_ON(tcp_inq(strp->sk) < strp->stm.full_len)) in tls_strp_msg_load()
374 tls_strp_load_anchor_with_queue(strp, strp->stm.full_len); in tls_strp_msg_load()
377 rxm = strp_msg(strp->anchor); in tls_strp_msg_load()
378 rxm->full_len = strp->stm.full_len; in tls_strp_msg_load()
379 rxm->offset = strp->stm.offset; in tls_strp_msg_load()
380 tlm = tls_msg(strp->anchor); in tls_strp_msg_load()
381 tlm->control = strp->mark; in tls_strp_msg_load()
385 static int tls_strp_read_sock(struct tls_strparser *strp) in tls_strp_read_sock() argument
389 inq = tcp_inq(strp->sk); in tls_strp_read_sock()
393 if (unlikely(strp->copy_mode)) in tls_strp_read_sock()
394 return tls_strp_read_copyin(strp); in tls_strp_read_sock()
396 if (inq < strp->stm.full_len) in tls_strp_read_sock()
397 return tls_strp_read_copy(strp, true); in tls_strp_read_sock()
399 if (!strp->stm.full_len) { in tls_strp_read_sock()
400 tls_strp_load_anchor_with_queue(strp, inq); in tls_strp_read_sock()
402 sz = tls_rx_msg_size(strp, strp->anchor); in tls_strp_read_sock()
404 tls_strp_abort_strp(strp, sz); in tls_strp_read_sock()
408 strp->stm.full_len = sz; in tls_strp_read_sock()
410 if (!strp->stm.full_len || inq < strp->stm.full_len) in tls_strp_read_sock()
411 return tls_strp_read_copy(strp, true); in tls_strp_read_sock()
414 if (!tls_strp_check_no_dup(strp)) in tls_strp_read_sock()
415 return tls_strp_read_copy(strp, false); in tls_strp_read_sock()
417 strp->msg_ready = 1; in tls_strp_read_sock()
418 tls_rx_msg_ready(strp); in tls_strp_read_sock()
423 void tls_strp_check_rcv(struct tls_strparser *strp) in tls_strp_check_rcv() argument
425 if (unlikely(strp->stopped) || strp->msg_ready) in tls_strp_check_rcv()
428 if (tls_strp_read_sock(strp) == -ENOMEM) in tls_strp_check_rcv()
429 queue_work(tls_strp_wq, &strp->work); in tls_strp_check_rcv()
433 void tls_strp_data_ready(struct tls_strparser *strp) in tls_strp_data_ready() argument
442 if (sock_owned_by_user_nocheck(strp->sk)) { in tls_strp_data_ready()
443 queue_work(tls_strp_wq, &strp->work); in tls_strp_data_ready()
447 tls_strp_check_rcv(strp); in tls_strp_data_ready()
452 struct tls_strparser *strp = in tls_strp_work() local
455 lock_sock(strp->sk); in tls_strp_work()
456 tls_strp_check_rcv(strp); in tls_strp_work()
457 release_sock(strp->sk); in tls_strp_work()
460 void tls_strp_msg_done(struct tls_strparser *strp) in tls_strp_msg_done() argument
462 WARN_ON(!strp->stm.full_len); in tls_strp_msg_done()
464 if (likely(!strp->copy_mode)) in tls_strp_msg_done()
465 tcp_read_done(strp->sk, strp->stm.full_len); in tls_strp_msg_done()
467 tls_strp_flush_anchor_copy(strp); in tls_strp_msg_done()
469 strp->msg_ready = 0; in tls_strp_msg_done()
470 memset(&strp->stm, 0, sizeof(strp->stm)); in tls_strp_msg_done()
472 tls_strp_check_rcv(strp); in tls_strp_msg_done()
475 void tls_strp_stop(struct tls_strparser *strp) in tls_strp_stop() argument
477 strp->stopped = 1; in tls_strp_stop()
480 int tls_strp_init(struct tls_strparser *strp, struct sock *sk) in tls_strp_init() argument
482 memset(strp, 0, sizeof(*strp)); in tls_strp_init()
484 strp->sk = sk; in tls_strp_init()
486 strp->anchor = alloc_skb(0, GFP_KERNEL); in tls_strp_init()
487 if (!strp->anchor) in tls_strp_init()
490 INIT_WORK(&strp->work, tls_strp_work); in tls_strp_init()
498 void tls_strp_done(struct tls_strparser *strp) in tls_strp_done() argument
500 WARN_ON(!strp->stopped); in tls_strp_done()
502 cancel_work_sync(&strp->work); in tls_strp_done()
503 tls_strp_anchor_free(strp); in tls_strp_done()