Lines Matching +full:buffered +full:- +full:positive

1 // SPDX-License-Identifier: GPL-2.0-only
40 return (struct _strp_msg *)((void *)skb->cb + in _strp_msg()
49 cancel_delayed_work(&strp->msg_timer_work); in strp_abort_strp()
51 if (strp->stopped) in strp_abort_strp()
54 strp->stopped = 1; in strp_abort_strp()
56 if (strp->sk) { in strp_abort_strp()
57 struct sock *sk = strp->sk; in strp_abort_strp()
60 sk->sk_err = -err; in strp_abort_strp()
68 mod_delayed_work(strp_wq, &strp->msg_timer_work, timeo); in strp_start_timer()
75 desc->error = err; in strp_parser_err()
76 kfree_skb(strp->skb_head); in strp_parser_err()
77 strp->skb_head = NULL; in strp_parser_err()
78 strp->cb.abort_parser(strp, err); in strp_parser_err()
83 if (strp->sk) { in strp_peek_len()
84 struct socket *sock = strp->sk->sk_socket; in strp_peek_len()
86 return sock->ops->peek_len(sock); in strp_peek_len()
101 struct strparser *strp = (struct strparser *)desc->arg.data; in __strp_recv()
109 if (strp->paused) in __strp_recv()
112 head = strp->skb_head; in __strp_recv()
116 /* Getting data with a non-zero offset when a message is in __strp_recv()
123 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
124 desc->error = -ENOMEM; in __strp_recv()
128 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
130 desc->error = -ENOMEM; in __strp_recv()
137 if (!strp->skb_nextp) { in __strp_recv()
143 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
144 desc->error = err; in __strp_recv()
148 if (unlikely(skb_shinfo(head)->frag_list)) { in __strp_recv()
152 * then are able to use the old head->next for in __strp_recv()
155 if (WARN_ON(head->next)) { in __strp_recv()
156 desc->error = -EINVAL; in __strp_recv()
162 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
163 desc->error = -ENOMEM; in __strp_recv()
167 strp->skb_nextp = &head->next; in __strp_recv()
168 strp->skb_head = skb; in __strp_recv()
171 strp->skb_nextp = in __strp_recv()
172 &skb_shinfo(head)->frag_list; in __strp_recv()
181 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
182 desc->error = -ENOMEM; in __strp_recv()
186 cand_len = orig_len - eaten; in __strp_recv()
188 head = strp->skb_head; in __strp_recv()
191 strp->skb_head = head; in __strp_recv()
193 strp->skb_nextp = NULL; in __strp_recv()
196 stm->strp.offset = orig_offset + eaten; in __strp_recv()
204 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
205 desc->error = err; in __strp_recv()
211 *strp->skb_nextp = skb; in __strp_recv()
212 strp->skb_nextp = &skb->next; in __strp_recv()
213 head->data_len += skb->len; in __strp_recv()
214 head->len += skb->len; in __strp_recv()
215 head->truesize += skb->truesize; in __strp_recv()
218 if (!stm->strp.full_len) { in __strp_recv()
221 len = (*strp->cb.parse_msg)(strp, head); in __strp_recv()
225 if (!stm->accum_len) { in __strp_recv()
229 stm->accum_len += cand_len; in __strp_recv()
231 STRP_STATS_INCR(strp->stats.need_more_hdr); in __strp_recv()
235 if (len == -ESTRPIPE && stm->accum_len) { in __strp_recv()
236 len = -ENODATA; in __strp_recv()
237 strp->unrecov_intr = 1; in __strp_recv()
239 strp->interrupted = 1; in __strp_recv()
245 STRP_STATS_INCR(strp->stats.msg_too_big); in __strp_recv()
246 strp_parser_err(strp, -EMSGSIZE, desc); in __strp_recv()
248 } else if (len <= (ssize_t)head->len - in __strp_recv()
249 skb->len - stm->strp.offset) { in __strp_recv()
253 STRP_STATS_INCR(strp->stats.bad_hdr_len); in __strp_recv()
254 strp_parser_err(strp, -EPROTO, desc); in __strp_recv()
258 stm->strp.full_len = len; in __strp_recv()
261 extra = (ssize_t)(stm->accum_len + cand_len) - in __strp_recv()
262 stm->strp.full_len; in __strp_recv()
266 if (stm->strp.full_len - stm->accum_len > in __strp_recv()
269 * buffer. Set strp->need_bytes to wait for in __strp_recv()
271 * eaten" since we've already buffered the skb in __strp_recv()
275 if (!stm->accum_len) { in __strp_recv()
280 stm->accum_len += cand_len; in __strp_recv()
282 strp->need_bytes = stm->strp.full_len - in __strp_recv()
283 stm->accum_len; in __strp_recv()
284 STRP_STATS_ADD(strp->stats.bytes, cand_len); in __strp_recv()
285 desc->count = 0; /* Stop reading socket */ in __strp_recv()
288 stm->accum_len += cand_len; in __strp_recv()
294 /* Positive extra indicates more bytes than needed for the in __strp_recv()
300 eaten += (cand_len - extra); in __strp_recv()
303 cancel_delayed_work(&strp->msg_timer_work); in __strp_recv()
304 strp->skb_head = NULL; in __strp_recv()
305 strp->need_bytes = 0; in __strp_recv()
306 STRP_STATS_INCR(strp->stats.msgs); in __strp_recv()
309 strp->cb.rcv_msg(strp, head); in __strp_recv()
311 if (unlikely(strp->paused)) { in __strp_recv()
320 STRP_STATS_ADD(strp->stats.bytes, eaten); in __strp_recv()
341 struct strparser *strp = (struct strparser *)desc->arg.data; in strp_recv()
344 strp->sk->sk_rcvbuf, strp->sk->sk_rcvtimeo); in strp_recv()
355 struct socket *sock = strp->sk->sk_socket; in strp_read_sock()
358 if (unlikely(!sock || !sock->ops || !sock->ops->read_sock)) in strp_read_sock()
359 return -EBUSY; in strp_read_sock()
366 sock->ops->read_sock(strp->sk, &desc, strp_recv); in strp_read_sock()
368 desc.error = strp->cb.read_sock_done(strp, desc.error); in strp_read_sock()
376 if (unlikely(strp->stopped) || strp->paused) in strp_data_ready()
386 if (sock_owned_by_user_nocheck(strp->sk)) { in strp_data_ready()
387 queue_work(strp_wq, &strp->work); in strp_data_ready()
391 if (strp->need_bytes) { in strp_data_ready()
392 if (strp_peek_len(strp) < strp->need_bytes) in strp_data_ready()
396 if (strp_read_sock(strp) == -ENOMEM) in strp_data_ready()
397 queue_work(strp_wq, &strp->work); in strp_data_ready()
406 strp->cb.lock(strp); in do_strp_work()
408 if (unlikely(strp->stopped)) in do_strp_work()
411 if (strp->paused) in do_strp_work()
414 if (strp_read_sock(strp) == -ENOMEM) in do_strp_work()
415 queue_work(strp_wq, &strp->work); in do_strp_work()
418 strp->cb.unlock(strp); in do_strp_work()
432 STRP_STATS_INCR(strp->stats.msg_timeouts); in strp_msg_timeout()
433 strp->cb.lock(strp); in strp_msg_timeout()
434 strp->cb.abort_parser(strp, -ETIMEDOUT); in strp_msg_timeout()
435 strp->cb.unlock(strp); in strp_msg_timeout()
440 lock_sock(strp->sk); in strp_sock_lock()
445 release_sock(strp->sk); in strp_sock_unlock()
452 if (!cb || !cb->rcv_msg || !cb->parse_msg) in strp_init()
453 return -EINVAL; in strp_init()
467 if (!cb->lock || !cb->unlock) in strp_init()
468 return -EINVAL; in strp_init()
473 strp->sk = sk; in strp_init()
475 strp->cb.lock = cb->lock ? : strp_sock_lock; in strp_init()
476 strp->cb.unlock = cb->unlock ? : strp_sock_unlock; in strp_init()
477 strp->cb.rcv_msg = cb->rcv_msg; in strp_init()
478 strp->cb.parse_msg = cb->parse_msg; in strp_init()
479 strp->cb.read_sock_done = cb->read_sock_done ? : default_read_sock_done; in strp_init()
480 strp->cb.abort_parser = cb->abort_parser ? : strp_abort_strp; in strp_init()
482 INIT_DELAYED_WORK(&strp->msg_timer_work, strp_msg_timeout); in strp_init()
483 INIT_WORK(&strp->work, strp_work); in strp_init()
492 strp->paused = 0; in __strp_unpause()
494 if (strp->need_bytes) { in __strp_unpause()
495 if (strp_peek_len(strp) < strp->need_bytes) in __strp_unpause()
504 strp->paused = 0; in strp_unpause()
509 queue_work(strp_wq, &strp->work); in strp_unpause()
518 WARN_ON(!strp->stopped); in strp_done()
520 cancel_delayed_work_sync(&strp->msg_timer_work); in strp_done()
521 cancel_work_sync(&strp->work); in strp_done()
523 if (strp->skb_head) { in strp_done()
524 kfree_skb(strp->skb_head); in strp_done()
525 strp->skb_head = NULL; in strp_done()
532 strp->stopped = 1; in strp_stop()
538 queue_work(strp_wq, &strp->work); in strp_check_rcv()
546 return -ENOMEM; in strp_dev_init()