xref: /openbmc/linux/include/net/sctp/ulpqueue.h (revision 6fdfdef7)
147505b8bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
260c778b2SVlad Yasevich /* SCTP kernel implementation
31da177e4SLinus Torvalds  * (C) Copyright IBM Corp. 2001, 2004
41da177e4SLinus Torvalds  * Copyright (c) 1999-2000 Cisco, Inc.
51da177e4SLinus Torvalds  * Copyright (c) 1999-2001 Motorola, Inc.
61da177e4SLinus Torvalds  * Copyright (c) 2001 Intel Corp.
71da177e4SLinus Torvalds  * Copyright (c) 2001 Nokia, Inc.
81da177e4SLinus Torvalds  * Copyright (c) 2001 La Monte H.P. Yarroll
91da177e4SLinus Torvalds  *
101da177e4SLinus Torvalds  * These are the definitions needed for the sctp_ulpq type.  The
111da177e4SLinus Torvalds  * sctp_ulpq is the interface between the Upper Layer Protocol, or ULP,
121da177e4SLinus Torvalds  * and the core SCTP state machine.  This is the component which handles
131da177e4SLinus Torvalds  * reassembly and ordering.
141da177e4SLinus Torvalds  *
151da177e4SLinus Torvalds  * Please send any bug reports or fixes you make to the
161da177e4SLinus Torvalds  * email addresses:
1791705c61SDaniel Borkmann  *    lksctp developers <linux-sctp@vger.kernel.org>
181da177e4SLinus Torvalds  *
191da177e4SLinus Torvalds  * Written or modified by:
201da177e4SLinus Torvalds  *   Jon Grimm             <jgrimm@us.ibm.com>
211da177e4SLinus Torvalds  *   La Monte H.P. Yarroll <piggy@acm.org>
221da177e4SLinus Torvalds  *   Sridhar Samudrala     <sri@us.ibm.com>
231da177e4SLinus Torvalds  */
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds #ifndef __sctp_ulpqueue_h__
261da177e4SLinus Torvalds #define __sctp_ulpqueue_h__
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds /* A structure to carry information to the ULP (e.g. Sockets API) */
291da177e4SLinus Torvalds struct sctp_ulpq {
301da177e4SLinus Torvalds 	char pd_mode;
311da177e4SLinus Torvalds 	struct sctp_association *asoc;
321da177e4SLinus Torvalds 	struct sk_buff_head reasm;
3313228238SXin Long 	struct sk_buff_head reasm_uo;
341da177e4SLinus Torvalds 	struct sk_buff_head lobby;
351da177e4SLinus Torvalds };
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds /* Prototypes. */
38*6fdfdef7SAlexey Kodanev void sctp_ulpq_init(struct sctp_ulpq *ulpq, struct sctp_association *asoc);
390b58a811SVlad Yasevich void sctp_ulpq_flush(struct sctp_ulpq *ulpq);
401da177e4SLinus Torvalds void sctp_ulpq_free(struct sctp_ulpq *);
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds /* Add a new DATA chunk for processing. */
43dd0fc66fSAl Viro int sctp_ulpq_tail_data(struct sctp_ulpq *, struct sctp_chunk *, gfp_t);
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds /* Add a new event for propagation to the ULP. */
46013b96ecSDavid Miller int sctp_ulpq_tail_event(struct sctp_ulpq *, struct sk_buff_head *skb_list);
471da177e4SLinus Torvalds 
481da177e4SLinus Torvalds /* Renege previously received chunks.  */
49dd0fc66fSAl Viro void sctp_ulpq_renege(struct sctp_ulpq *, struct sctp_chunk *, gfp_t);
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds /* Perform partial delivery. */
52b26ddd81SNeil Horman void sctp_ulpq_partial_delivery(struct sctp_ulpq *, gfp_t);
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds /* Abort the partial delivery. */
55dd0fc66fSAl Viro void sctp_ulpq_abort_pd(struct sctp_ulpq *, gfp_t);
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds /* Clear the partial data delivery condition on this socket. */
58b6e1331fSVlad Yasevich int sctp_clear_pd(struct sock *sk, struct sctp_association *asoc);
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds /* Skip over an SSN. */
611da177e4SLinus Torvalds void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn);
621da177e4SLinus Torvalds 
63ea2dfb37SVlad Yasevich void sctp_ulpq_reasm_flushtsn(struct sctp_ulpq *, __u32);
6494014e8dSXin Long 
6594014e8dSXin Long __u16 sctp_ulpq_renege_list(struct sctp_ulpq *ulpq,
6694014e8dSXin Long 			    struct sk_buff_head *list, __u16 needed);
6794014e8dSXin Long 
681da177e4SLinus Torvalds #endif /* __sctp_ulpqueue_h__ */
69