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 if (unlikely(!strp->cb.read_sock && !sock->ops->read_sock)) in strp_read_sock()
356 desc.arg.data = strp; in strp_read_sock()
361 if (strp->cb.read_sock) in strp_read_sock()
362 strp->cb.read_sock(strp, &desc, strp_recv); in strp_read_sock()
364 sock->ops->read_sock(strp->sk, &desc, strp_recv); in strp_read_sock()
366 desc.error = strp->cb.read_sock_done(strp, desc.error); in strp_read_sock()
372 void strp_data_ready(struct strparser *strp) in strp_data_ready() argument
374 if (unlikely(strp->stopped) || strp->paused) in strp_data_ready()
384 if (sock_owned_by_user_nocheck(strp->sk)) { in strp_data_ready()
385 queue_work(strp_wq, &strp->work); in strp_data_ready()
389 if (strp->need_bytes) { in strp_data_ready()
390 if (strp_peek_len(strp) < strp->need_bytes) in strp_data_ready()
394 if (strp_read_sock(strp) == -ENOMEM) in strp_data_ready()
395 queue_work(strp_wq, &strp->work); in strp_data_ready()
399 static void do_strp_work(struct strparser *strp) in do_strp_work() argument
404 strp->cb.lock(strp); in do_strp_work()
406 if (unlikely(strp->stopped)) in do_strp_work()
409 if (strp->paused) in do_strp_work()
412 if (strp_read_sock(strp) == -ENOMEM) in do_strp_work()
413 queue_work(strp_wq, &strp->work); in do_strp_work()
416 strp->cb.unlock(strp); in do_strp_work()
426 struct strparser *strp = container_of(w, struct strparser, in strp_msg_timeout() local
430 STRP_STATS_INCR(strp->stats.msg_timeouts); in strp_msg_timeout()
431 strp->cb.lock(strp); in strp_msg_timeout()
432 strp->cb.abort_parser(strp, -ETIMEDOUT); in strp_msg_timeout()
433 strp->cb.unlock(strp); in strp_msg_timeout()
436 static void strp_sock_lock(struct strparser *strp) in strp_sock_lock() argument
438 lock_sock(strp->sk); in strp_sock_lock()
441 static void strp_sock_unlock(struct strparser *strp) in strp_sock_unlock() argument
443 release_sock(strp->sk); in strp_sock_unlock()
446 int strp_init(struct strparser *strp, struct sock *sk, in strp_init() argument
469 memset(strp, 0, sizeof(*strp)); in strp_init()
471 strp->sk = sk; in strp_init()
473 strp->cb.lock = cb->lock ? : strp_sock_lock; in strp_init()
474 strp->cb.unlock = cb->unlock ? : strp_sock_unlock; in strp_init()
475 strp->cb.rcv_msg = cb->rcv_msg; in strp_init()
476 strp->cb.parse_msg = cb->parse_msg; in strp_init()
477 strp->cb.read_sock = cb->read_sock; in strp_init()
478 strp->cb.read_sock_done = cb->read_sock_done ? : default_read_sock_done; in strp_init()
479 strp->cb.abort_parser = cb->abort_parser ? : strp_abort_strp; in strp_init()
481 INIT_DELAYED_WORK(&strp->msg_timer_work, strp_msg_timeout); in strp_init()
482 INIT_WORK(&strp->work, strp_work); in strp_init()
489 void __strp_unpause(struct strparser *strp) in __strp_unpause() argument
491 strp->paused = 0; in __strp_unpause()
493 if (strp->need_bytes) { in __strp_unpause()
494 if (strp_peek_len(strp) < strp->need_bytes) in __strp_unpause()
497 strp_read_sock(strp); in __strp_unpause()
501 void strp_unpause(struct strparser *strp) in strp_unpause() argument
503 strp->paused = 0; in strp_unpause()
508 queue_work(strp_wq, &strp->work); in strp_unpause()
515 void strp_done(struct strparser *strp) in strp_done() argument
517 WARN_ON(!strp->stopped); in strp_done()
519 cancel_delayed_work_sync(&strp->msg_timer_work); in strp_done()
520 cancel_work_sync(&strp->work); in strp_done()
522 if (strp->skb_head) { in strp_done()
523 kfree_skb(strp->skb_head); in strp_done()
524 strp->skb_head = NULL; in strp_done()
529 void strp_stop(struct strparser *strp) in strp_stop() argument
531 strp->stopped = 1; in strp_stop()
535 void strp_check_rcv(struct strparser *strp) in strp_check_rcv() argument
537 queue_work(strp_wq, &strp->work); in strp_check_rcv()