Lines Matching refs:strp

33 		offsetof(struct sk_skb_cb, strp));  in _strp_msg()
37 static void strp_abort_strp(struct strparser *strp, int err) in strp_abort_strp() argument
41 cancel_delayed_work(&strp->msg_timer_work); in strp_abort_strp()
43 if (strp->stopped) in strp_abort_strp()
46 strp->stopped = 1; in strp_abort_strp()
48 if (strp->sk) { in strp_abort_strp()
49 struct sock *sk = strp->sk; in strp_abort_strp()
57 static void strp_start_timer(struct strparser *strp, long timeo) in strp_start_timer() argument
60 mod_delayed_work(strp_wq, &strp->msg_timer_work, timeo); in strp_start_timer()
64 static void strp_parser_err(struct strparser *strp, int err, in strp_parser_err() argument
68 kfree_skb(strp->skb_head); in strp_parser_err()
69 strp->skb_head = NULL; in strp_parser_err()
70 strp->cb.abort_parser(strp, err); in strp_parser_err()
73 static inline int strp_peek_len(struct strparser *strp) in strp_peek_len() argument
75 if (strp->sk) { in strp_peek_len()
76 struct socket *sock = strp->sk->sk_socket; in strp_peek_len()
93 struct strparser *strp = (struct strparser *)desc->arg.data; in __strp_recv() local
101 if (strp->paused) in __strp_recv()
104 head = strp->skb_head; in __strp_recv()
115 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
120 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
129 if (!strp->skb_nextp) { in __strp_recv()
135 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
154 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
159 strp->skb_nextp = &head->next; in __strp_recv()
160 strp->skb_head = skb; in __strp_recv()
163 strp->skb_nextp = in __strp_recv()
173 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
180 head = strp->skb_head; in __strp_recv()
183 strp->skb_head = head; in __strp_recv()
185 strp->skb_nextp = NULL; in __strp_recv()
188 stm->strp.offset = orig_offset + eaten; in __strp_recv()
196 STRP_STATS_INCR(strp->stats.mem_fail); in __strp_recv()
203 *strp->skb_nextp = skb; in __strp_recv()
204 strp->skb_nextp = &skb->next; in __strp_recv()
210 if (!stm->strp.full_len) { in __strp_recv()
213 len = (*strp->cb.parse_msg)(strp, head); in __strp_recv()
219 strp_start_timer(strp, timeo); in __strp_recv()
223 STRP_STATS_INCR(strp->stats.need_more_hdr); in __strp_recv()
229 strp->unrecov_intr = 1; in __strp_recv()
231 strp->interrupted = 1; in __strp_recv()
233 strp_parser_err(strp, len, desc); in __strp_recv()
237 STRP_STATS_INCR(strp->stats.msg_too_big); in __strp_recv()
238 strp_parser_err(strp, -EMSGSIZE, desc); in __strp_recv()
241 skb->len - stm->strp.offset) { in __strp_recv()
245 STRP_STATS_INCR(strp->stats.bad_hdr_len); in __strp_recv()
246 strp_parser_err(strp, -EPROTO, desc); in __strp_recv()
250 stm->strp.full_len = len; in __strp_recv()
254 stm->strp.full_len; in __strp_recv()
258 if (stm->strp.full_len - stm->accum_len > in __strp_recv()
259 strp_peek_len(strp)) { in __strp_recv()
269 strp_start_timer(strp, timeo); in __strp_recv()
274 strp->need_bytes = stm->strp.full_len - in __strp_recv()
276 STRP_STATS_ADD(strp->stats.bytes, cand_len); in __strp_recv()
295 cancel_delayed_work(&strp->msg_timer_work); in __strp_recv()
296 strp->skb_head = NULL; in __strp_recv()
297 strp->need_bytes = 0; in __strp_recv()
298 STRP_STATS_INCR(strp->stats.msgs); in __strp_recv()
301 strp->cb.rcv_msg(strp, head); in __strp_recv()
303 if (unlikely(strp->paused)) { in __strp_recv()
312 STRP_STATS_ADD(strp->stats.bytes, eaten); in __strp_recv()
317 int strp_process(struct strparser *strp, struct sk_buff *orig_skb, in strp_process() argument
323 desc.arg.data = strp; in strp_process()
333 struct strparser *strp = (struct strparser *)desc->arg.data; in strp_recv() local
336 strp->sk->sk_rcvbuf, strp->sk->sk_rcvtimeo); in strp_recv()
339 static int default_read_sock_done(struct strparser *strp, int err) in default_read_sock_done() argument
345 static int strp_read_sock(struct strparser *strp) in strp_read_sock() argument
347 struct socket *sock = strp->sk->sk_socket; in strp_read_sock()
353 desc.arg.data = strp; in strp_read_sock()
358 sock->ops->read_sock(strp->sk, &desc, strp_recv); in strp_read_sock()
360 desc.error = strp->cb.read_sock_done(strp, desc.error); in strp_read_sock()
366 void strp_data_ready(struct strparser *strp) in strp_data_ready() argument
368 if (unlikely(strp->stopped) || strp->paused) in strp_data_ready()
378 if (sock_owned_by_user_nocheck(strp->sk)) { in strp_data_ready()
379 queue_work(strp_wq, &strp->work); in strp_data_ready()
383 if (strp->need_bytes) { in strp_data_ready()
384 if (strp_peek_len(strp) < strp->need_bytes) in strp_data_ready()
388 if (strp_read_sock(strp) == -ENOMEM) in strp_data_ready()
389 queue_work(strp_wq, &strp->work); in strp_data_ready()
393 static void do_strp_work(struct strparser *strp) in do_strp_work() argument
398 strp->cb.lock(strp); in do_strp_work()
400 if (unlikely(strp->stopped)) in do_strp_work()
403 if (strp->paused) in do_strp_work()
406 if (strp_read_sock(strp) == -ENOMEM) in do_strp_work()
407 queue_work(strp_wq, &strp->work); in do_strp_work()
410 strp->cb.unlock(strp); in do_strp_work()
420 struct strparser *strp = container_of(w, struct strparser, in strp_msg_timeout() local
424 STRP_STATS_INCR(strp->stats.msg_timeouts); in strp_msg_timeout()
425 strp->cb.lock(strp); in strp_msg_timeout()
426 strp->cb.abort_parser(strp, -ETIMEDOUT); in strp_msg_timeout()
427 strp->cb.unlock(strp); in strp_msg_timeout()
430 static void strp_sock_lock(struct strparser *strp) in strp_sock_lock() argument
432 lock_sock(strp->sk); in strp_sock_lock()
435 static void strp_sock_unlock(struct strparser *strp) in strp_sock_unlock() argument
437 release_sock(strp->sk); in strp_sock_unlock()
440 int strp_init(struct strparser *strp, struct sock *sk, in strp_init() argument
463 memset(strp, 0, sizeof(*strp)); in strp_init()
465 strp->sk = sk; in strp_init()
467 strp->cb.lock = cb->lock ? : strp_sock_lock; in strp_init()
468 strp->cb.unlock = cb->unlock ? : strp_sock_unlock; in strp_init()
469 strp->cb.rcv_msg = cb->rcv_msg; in strp_init()
470 strp->cb.parse_msg = cb->parse_msg; in strp_init()
471 strp->cb.read_sock_done = cb->read_sock_done ? : default_read_sock_done; in strp_init()
472 strp->cb.abort_parser = cb->abort_parser ? : strp_abort_strp; in strp_init()
474 INIT_DELAYED_WORK(&strp->msg_timer_work, strp_msg_timeout); in strp_init()
475 INIT_WORK(&strp->work, strp_work); in strp_init()
482 void __strp_unpause(struct strparser *strp) in __strp_unpause() argument
484 strp->paused = 0; in __strp_unpause()
486 if (strp->need_bytes) { in __strp_unpause()
487 if (strp_peek_len(strp) < strp->need_bytes) in __strp_unpause()
490 strp_read_sock(strp); in __strp_unpause()
494 void strp_unpause(struct strparser *strp) in strp_unpause() argument
496 strp->paused = 0; in strp_unpause()
501 queue_work(strp_wq, &strp->work); in strp_unpause()
508 void strp_done(struct strparser *strp) in strp_done() argument
510 WARN_ON(!strp->stopped); in strp_done()
512 cancel_delayed_work_sync(&strp->msg_timer_work); in strp_done()
513 cancel_work_sync(&strp->work); in strp_done()
515 if (strp->skb_head) { in strp_done()
516 kfree_skb(strp->skb_head); in strp_done()
517 strp->skb_head = NULL; in strp_done()
522 void strp_stop(struct strparser *strp) in strp_stop() argument
524 strp->stopped = 1; in strp_stop()
528 void strp_check_rcv(struct strparser *strp) in strp_check_rcv() argument
530 queue_work(strp_wq, &strp->work); in strp_check_rcv()