Lines Matching +full:buffered +full:- +full:positive
42 return (struct _strp_msg *)((void *)skb->cb + in _strp_msg()
51 cancel_delayed_work(&strp->msg_timer_work); in strp_abort_strp()
53 if (strp->stopped) in strp_abort_strp()
56 strp->stopped = 1; in strp_abort_strp()
58 if (strp->sk) { in strp_abort_strp()
59 struct sock *sk = strp->sk; in strp_abort_strp()
62 sk->sk_err = -err; in strp_abort_strp()
63 sk->sk_error_report(sk); in strp_abort_strp()
70 mod_delayed_work(strp_wq, &strp->msg_timer_work, timeo); in strp_start_timer()
77 desc->error = err; in strp_parser_err()
78 kfree_skb(strp->skb_head); in strp_parser_err()
79 strp->skb_head = NULL; in strp_parser_err()
80 strp->cb.abort_parser(strp, err); in strp_parser_err()
85 if (strp->sk) { in strp_peek_len()
86 struct socket *sock = strp->sk->sk_socket; in strp_peek_len()
88 return sock->ops->peek_len(sock); in strp_peek_len()
103 struct strparser *strp = (struct strparser *)desc->arg.data; in __strp_recv()
111 if (strp->paused) in __strp_recv()
114 head = strp->skb_head; in __strp_recv()
118 /* Getting data with a non-zero offset when a message is in __strp_recv()
125 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
126 desc->error = -ENOMEM; in __strp_recv()
130 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
132 desc->error = -ENOMEM; in __strp_recv()
139 if (!strp->skb_nextp) { in __strp_recv()
145 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
146 desc->error = err; in __strp_recv()
150 if (unlikely(skb_shinfo(head)->frag_list)) { in __strp_recv()
154 * then are able to use the old head->next for in __strp_recv()
157 if (WARN_ON(head->next)) { in __strp_recv()
158 desc->error = -EINVAL; in __strp_recv()
164 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
165 desc->error = -ENOMEM; in __strp_recv()
168 skb->len = head->len; in __strp_recv()
169 skb->data_len = head->len; in __strp_recv()
170 skb->truesize = head->truesize; in __strp_recv()
172 strp->skb_nextp = &head->next; in __strp_recv()
173 skb_shinfo(skb)->frag_list = head; in __strp_recv()
174 strp->skb_head = skb; in __strp_recv()
177 strp->skb_nextp = in __strp_recv()
178 &skb_shinfo(head)->frag_list; in __strp_recv()
187 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
188 desc->error = -ENOMEM; in __strp_recv()
192 cand_len = orig_len - eaten; in __strp_recv()
194 head = strp->skb_head; in __strp_recv()
197 strp->skb_head = head; in __strp_recv()
199 strp->skb_nextp = NULL; in __strp_recv()
202 stm->strp.offset = orig_offset + eaten; in __strp_recv()
210 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
211 desc->error = err; in __strp_recv()
217 *strp->skb_nextp = skb; in __strp_recv()
218 strp->skb_nextp = &skb->next; in __strp_recv()
219 head->data_len += skb->len; in __strp_recv()
220 head->len += skb->len; in __strp_recv()
221 head->truesize += skb->truesize; in __strp_recv()
224 if (!stm->strp.full_len) { in __strp_recv()
227 len = (*strp->cb.parse_msg)(strp, head); in __strp_recv()
231 if (!stm->accum_len) { in __strp_recv()
235 stm->accum_len += cand_len; in __strp_recv()
237 STRP_STATS_INCR(strp->stats.need_more_hdr); in __strp_recv()
241 if (len == -ESTRPIPE && stm->accum_len) { in __strp_recv()
242 len = -ENODATA; in __strp_recv()
243 strp->unrecov_intr = 1; in __strp_recv()
245 strp->interrupted = 1; in __strp_recv()
251 STRP_STATS_INCR(strp->stats.msg_too_big); in __strp_recv()
252 strp_parser_err(strp, -EMSGSIZE, desc); in __strp_recv()
254 } else if (len <= (ssize_t)head->len - in __strp_recv()
255 skb->len - stm->strp.offset) { in __strp_recv()
259 STRP_STATS_INCR(strp->stats.bad_hdr_len); in __strp_recv()
260 strp_parser_err(strp, -EPROTO, desc); in __strp_recv()
264 stm->strp.full_len = len; in __strp_recv()
267 extra = (ssize_t)(stm->accum_len + cand_len) - in __strp_recv()
268 stm->strp.full_len; in __strp_recv()
272 if (stm->strp.full_len - stm->accum_len > in __strp_recv()
275 * buffer. Set strp->need_bytes to wait for in __strp_recv()
277 * eaten" since we've already buffered the skb in __strp_recv()
281 if (!stm->accum_len) { in __strp_recv()
286 stm->accum_len += cand_len; in __strp_recv()
288 strp->need_bytes = stm->strp.full_len - in __strp_recv()
289 stm->accum_len; in __strp_recv()
290 STRP_STATS_ADD(strp->stats.bytes, cand_len); in __strp_recv()
291 desc->count = 0; /* Stop reading socket */ in __strp_recv()
294 stm->accum_len += cand_len; in __strp_recv()
300 /* Positive extra indicates ore bytes than needed for the in __strp_recv()
306 eaten += (cand_len - extra); in __strp_recv()
309 cancel_delayed_work(&strp->msg_timer_work); in __strp_recv()
310 strp->skb_head = NULL; in __strp_recv()
311 strp->need_bytes = 0; in __strp_recv()
312 STRP_STATS_INCR(strp->stats.msgs); in __strp_recv()
315 strp->cb.rcv_msg(strp, head); in __strp_recv()
317 if (unlikely(strp->paused)) { in __strp_recv()
326 STRP_STATS_ADD(strp->stats.bytes, eaten); in __strp_recv()
347 struct strparser *strp = (struct strparser *)desc->arg.data; in strp_recv()
350 strp->sk->sk_rcvbuf, strp->sk->sk_rcvtimeo); in strp_recv()
361 struct socket *sock = strp->sk->sk_socket; in strp_read_sock()
364 if (unlikely(!sock || !sock->ops || !sock->ops->read_sock)) in strp_read_sock()
365 return -EBUSY; in strp_read_sock()
372 sock->ops->read_sock(strp->sk, &desc, strp_recv); in strp_read_sock()
374 desc.error = strp->cb.read_sock_done(strp, desc.error); in strp_read_sock()
382 if (unlikely(strp->stopped) || strp->paused) in strp_data_ready()
392 if (sock_owned_by_user_nocheck(strp->sk)) { in strp_data_ready()
393 queue_work(strp_wq, &strp->work); in strp_data_ready()
397 if (strp->need_bytes) { in strp_data_ready()
398 if (strp_peek_len(strp) < strp->need_bytes) in strp_data_ready()
402 if (strp_read_sock(strp) == -ENOMEM) in strp_data_ready()
403 queue_work(strp_wq, &strp->work); in strp_data_ready()
412 strp->cb.lock(strp); in do_strp_work()
414 if (unlikely(strp->stopped)) in do_strp_work()
417 if (strp->paused) in do_strp_work()
420 if (strp_read_sock(strp) == -ENOMEM) in do_strp_work()
421 queue_work(strp_wq, &strp->work); in do_strp_work()
424 strp->cb.unlock(strp); in do_strp_work()
438 STRP_STATS_INCR(strp->stats.msg_timeouts); in strp_msg_timeout()
439 strp->cb.lock(strp); in strp_msg_timeout()
440 strp->cb.abort_parser(strp, -ETIMEDOUT); in strp_msg_timeout()
441 strp->cb.unlock(strp); in strp_msg_timeout()
446 lock_sock(strp->sk); in strp_sock_lock()
451 release_sock(strp->sk); in strp_sock_unlock()
458 if (!cb || !cb->rcv_msg || !cb->parse_msg) in strp_init()
459 return -EINVAL; in strp_init()
473 if (!cb->lock || !cb->unlock) in strp_init()
474 return -EINVAL; in strp_init()
479 strp->sk = sk; in strp_init()
481 strp->cb.lock = cb->lock ? : strp_sock_lock; in strp_init()
482 strp->cb.unlock = cb->unlock ? : strp_sock_unlock; in strp_init()
483 strp->cb.rcv_msg = cb->rcv_msg; in strp_init()
484 strp->cb.parse_msg = cb->parse_msg; in strp_init()
485 strp->cb.read_sock_done = cb->read_sock_done ? : default_read_sock_done; in strp_init()
486 strp->cb.abort_parser = cb->abort_parser ? : strp_abort_strp; in strp_init()
488 INIT_DELAYED_WORK(&strp->msg_timer_work, strp_msg_timeout); in strp_init()
489 INIT_WORK(&strp->work, strp_work); in strp_init()
498 strp->paused = 0; in __strp_unpause()
500 if (strp->need_bytes) { in __strp_unpause()
501 if (strp_peek_len(strp) < strp->need_bytes) in __strp_unpause()
510 strp->paused = 0; in strp_unpause()
515 queue_work(strp_wq, &strp->work); in strp_unpause()
524 WARN_ON(!strp->stopped); in strp_done()
526 cancel_delayed_work_sync(&strp->msg_timer_work); in strp_done()
527 cancel_work_sync(&strp->work); in strp_done()
529 if (strp->skb_head) { in strp_done()
530 kfree_skb(strp->skb_head); in strp_done()
531 strp->skb_head = NULL; in strp_done()
538 strp->stopped = 1; in strp_stop()
544 queue_work(strp_wq, &strp->work); in strp_check_rcv()