On Wed, Oct 13, 2010 at 4:36 AM, Shan Wei <shanwei@xxxxxxxxxxxxxx> wrote: > Yaogong Wang wrote, at 09/12/2010 09:13 AM: >> Provide a sample kernel module that uses the pluggable multistream >> scheduling framework. This module implements strict priority queue. >> >> Signed-off-by: Yaogong Wang <ywang15@xxxxxxxx> >> --- >> net/sctp/Kconfig | 12 ++++++ >> net/sctp/Makefile | 1 + >> net/sctp/sctp_prio.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 116 insertions(+), 0 deletions(-) >> create mode 100644 net/sctp/sctp_prio.c >> >> diff --git a/net/sctp/Kconfig b/net/sctp/Kconfig >> index 126b014..85c8ded 100644 >> --- a/net/sctp/Kconfig >> +++ b/net/sctp/Kconfig >> @@ -37,6 +37,18 @@ menuconfig IP_SCTP >> >> if IP_SCTP >> >> +config SCTP_SCHED_PRIO >> + tristate "SCTP Multistream Scheduling: Priority Queue" >> + default m >> + help >> + This module provides the ability to use priority queue >> + to schedule multiple streams within an association. >> + >> + To compile this code as a module, choose M here: the >> + module will be called sctp_prio. >> + >> + If in doubt, say N. >> + >> config NET_SCTPPROBE >> tristate "SCTP: Association probing" >> depends on PROC_FS && KPROBES >> diff --git a/net/sctp/Makefile b/net/sctp/Makefile >> index 4e8b65d..89be03a 100644 >> --- a/net/sctp/Makefile >> +++ b/net/sctp/Makefile >> @@ -4,6 +4,7 @@ >> >> obj-$(CONFIG_IP_SCTP) += sctp.o >> obj-$(CONFIG_NET_SCTPPROBE) += sctp_probe.o >> +obj-$(CONFIG_SCTP_SCHED_PRIO) += sctp_prio.o >> >> sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \ >> protocol.o endpointola.o associola.o \ >> diff --git a/net/sctp/sctp_prio.c b/net/sctp/sctp_prio.c >> new file mode 100644 >> index 0000000..11e7e11 >> --- /dev/null >> +++ b/net/sctp/sctp_prio.c >> @@ -0,0 +1,103 @@ >> +/* >> + * SCTP multistream scheduling: priority queue >> + */ >> + >> +#include <linux/module.h> >> +#include <linux/types.h> >> +#include <linux/list.h> >> +#include <net/sctp/sctp.h> >> + >> +static int prio_init(struct sctp_outq *q, gfp_t gfp) >> +{ >> + __u16 i; >> + q->out_chunk_list = kmalloc(q->asoc->c.sinit_num_ostreams >> + * sizeof(struct list_head), gfp); >> + if (!q->out_chunk_list) >> + return -ENOMEM; >> + for (i = 0; i < q->asoc->c.sinit_num_ostreams; i++) >> + INIT_LIST_HEAD(&q->out_chunk_list[i]); >> + >> + return 0; >> +} >> + >> +static void prio_release(struct sctp_outq *q) >> +{ >> + kfree(q->out_chunk_list); >> + return; >> +} >> + >> +static void prio_enqueue_head_data(struct sctp_outq *q, >> + struct sctp_chunk *ch) >> +{ >> + list_add(&ch->list, &q->out_chunk_list[ch->sinfo.sinfo_stream]); > > User can using SCTP_SNDRCV option to specific stream number. > So, It is necessary to check stream number with q->asoc->c.sinit_num_ostreams. Isn't this check already performed in sctp_sendmsg() before it comes to sctp_outq? > >> + q->out_qlen += ch->skb->len; >> + return; >> +} >> + >> +static void prio_enqueue_tail_data(struct sctp_outq *q, struct sctp_chunk *ch) >> +{ >> + list_add_tail(&ch->list, &q->out_chunk_list[ch->sinfo.sinfo_stream]); > > need to check too. > > > > -- > Best Regards > ----- > Shan Wei > > -- ======================== Yaogong Wang, PhD candidate Department of Computer Science North Carolina State University http://www4.ncsu.edu/~ywang15/ ======================== -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html