1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* SCTP kernel implementation 3*4882a593Smuzhiyun * (C) Copyright Red Hat Inc. 2017 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * These are definitions used by the stream schedulers, defined in RFC 6*4882a593Smuzhiyun * draft ndata (https://tools.ietf.org/html/draft-ietf-tsvwg-sctp-ndata-11) 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Please send any bug reports or fixes you make to the 9*4882a593Smuzhiyun * email addresses: 10*4882a593Smuzhiyun * lksctp developers <linux-sctp@vger.kernel.org> 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Written or modified by: 13*4882a593Smuzhiyun * Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifndef __sctp_stream_sched_h__ 17*4882a593Smuzhiyun #define __sctp_stream_sched_h__ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun struct sctp_sched_ops { 20*4882a593Smuzhiyun /* Property handling for a given stream */ 21*4882a593Smuzhiyun int (*set)(struct sctp_stream *stream, __u16 sid, __u16 value, 22*4882a593Smuzhiyun gfp_t gfp); 23*4882a593Smuzhiyun int (*get)(struct sctp_stream *stream, __u16 sid, __u16 *value); 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* Init the specific scheduler */ 26*4882a593Smuzhiyun int (*init)(struct sctp_stream *stream); 27*4882a593Smuzhiyun /* Init a stream */ 28*4882a593Smuzhiyun int (*init_sid)(struct sctp_stream *stream, __u16 sid, gfp_t gfp); 29*4882a593Smuzhiyun /* free a stream */ 30*4882a593Smuzhiyun void (*free_sid)(struct sctp_stream *stream, __u16 sid); 31*4882a593Smuzhiyun /* Frees the entire thing */ 32*4882a593Smuzhiyun void (*free)(struct sctp_stream *stream); 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Enqueue a chunk */ 35*4882a593Smuzhiyun void (*enqueue)(struct sctp_outq *q, struct sctp_datamsg *msg); 36*4882a593Smuzhiyun /* Dequeue a chunk */ 37*4882a593Smuzhiyun struct sctp_chunk *(*dequeue)(struct sctp_outq *q); 38*4882a593Smuzhiyun /* Called only if the chunk fit the packet */ 39*4882a593Smuzhiyun void (*dequeue_done)(struct sctp_outq *q, struct sctp_chunk *chunk); 40*4882a593Smuzhiyun /* Sched all chunks already enqueued */ 41*4882a593Smuzhiyun void (*sched_all)(struct sctp_stream *steam); 42*4882a593Smuzhiyun /* Unched all chunks already enqueued */ 43*4882a593Smuzhiyun void (*unsched_all)(struct sctp_stream *steam); 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun int sctp_sched_set_sched(struct sctp_association *asoc, 47*4882a593Smuzhiyun enum sctp_sched_type sched); 48*4882a593Smuzhiyun int sctp_sched_get_sched(struct sctp_association *asoc); 49*4882a593Smuzhiyun int sctp_sched_set_value(struct sctp_association *asoc, __u16 sid, 50*4882a593Smuzhiyun __u16 value, gfp_t gfp); 51*4882a593Smuzhiyun int sctp_sched_get_value(struct sctp_association *asoc, __u16 sid, 52*4882a593Smuzhiyun __u16 *value); 53*4882a593Smuzhiyun void sctp_sched_dequeue_done(struct sctp_outq *q, struct sctp_chunk *ch); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun void sctp_sched_dequeue_common(struct sctp_outq *q, struct sctp_chunk *ch); 56*4882a593Smuzhiyun int sctp_sched_init_sid(struct sctp_stream *stream, __u16 sid, gfp_t gfp); 57*4882a593Smuzhiyun struct sctp_sched_ops *sctp_sched_ops_from_stream(struct sctp_stream *stream); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun void sctp_sched_ops_register(enum sctp_sched_type sched, 60*4882a593Smuzhiyun struct sctp_sched_ops *sched_ops); 61*4882a593Smuzhiyun void sctp_sched_ops_prio_init(void); 62*4882a593Smuzhiyun void sctp_sched_ops_rr_init(void); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #endif /* __sctp_stream_sched_h__ */ 65