Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/netpfil/ipfw/dn_sched_fifo.c
39482 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2010 Riccardo Panicucci, Universita` di Pisa
5
* All rights reserved
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
/*
30
*/
31
32
#ifdef _KERNEL
33
#include <sys/malloc.h>
34
#include <sys/socket.h>
35
#include <sys/socketvar.h>
36
#include <sys/kernel.h>
37
#include <sys/lock.h>
38
#include <sys/mbuf.h>
39
#include <sys/module.h>
40
#include <sys/rwlock.h>
41
#include <net/if.h> /* IFNAMSIZ */
42
#include <netinet/in.h>
43
#include <netinet/ip_var.h> /* ipfw_rule_ref */
44
#include <netinet/ip_fw.h> /* flow_id */
45
#include <netinet/ip_dummynet.h>
46
#include <netpfil/ipfw/ip_fw_private.h>
47
#include <netpfil/ipfw/dn_heap.h>
48
#include <netpfil/ipfw/ip_dn_private.h>
49
#ifdef NEW_AQM
50
#include <netpfil/ipfw/dn_aqm.h>
51
#endif
52
#include <netpfil/ipfw/dn_sched.h>
53
#else
54
#include <dn_test.h>
55
#endif
56
57
/*
58
* This file implements a FIFO scheduler for a single queue.
59
* The queue is allocated as part of the scheduler instance,
60
* and there is a single flowset is in the template which stores
61
* queue size and policy.
62
* Enqueue and dequeue use the default library functions.
63
*/
64
static int
65
fifo_enqueue(struct dn_sch_inst *si, struct dn_queue *q, struct mbuf *m)
66
{
67
/* XXX if called with q != NULL and m=NULL, this is a
68
* re-enqueue from an existing scheduler, which we should
69
* handle.
70
*/
71
(void)q;
72
return dn_enqueue((struct dn_queue *)(si+1), m, 0);
73
}
74
75
static struct mbuf *
76
fifo_dequeue(struct dn_sch_inst *si)
77
{
78
return dn_dequeue((struct dn_queue *)(si + 1));
79
}
80
81
static int
82
fifo_new_sched(struct dn_sch_inst *si)
83
{
84
/* This scheduler instance contains the queue */
85
struct dn_queue *q = (struct dn_queue *)(si + 1);
86
87
set_oid(&q->ni.oid, DN_QUEUE, sizeof(*q));
88
q->_si = si;
89
q->fs = si->sched->fs;
90
return 0;
91
}
92
93
static int
94
fifo_free_sched(struct dn_sch_inst *si)
95
{
96
struct dn_queue *q = (struct dn_queue *)(si + 1);
97
dn_free_pkts(q->mq.head);
98
bzero(q, sizeof(*q));
99
return 0;
100
}
101
102
/*
103
* FIFO scheduler descriptor
104
* contains the type of the scheduler, the name, the size of extra
105
* data structures, and function pointers.
106
*/
107
static struct dn_alg fifo_desc = {
108
_SI( .type = ) DN_SCHED_FIFO,
109
_SI( .name = ) "FIFO",
110
_SI( .flags = ) 0,
111
112
_SI( .schk_datalen = ) 0,
113
_SI( .si_datalen = ) sizeof(struct dn_queue),
114
_SI( .q_datalen = ) 0,
115
116
_SI( .enqueue = ) fifo_enqueue,
117
_SI( .dequeue = ) fifo_dequeue,
118
_SI( .config = ) NULL,
119
_SI( .destroy = ) NULL,
120
_SI( .new_sched = ) fifo_new_sched,
121
_SI( .free_sched = ) fifo_free_sched,
122
_SI( .new_fsk = ) NULL,
123
_SI( .free_fsk = ) NULL,
124
_SI( .new_queue = ) NULL,
125
_SI( .free_queue = ) NULL,
126
#ifdef NEW_AQM
127
_SI( .getconfig = ) NULL,
128
#endif
129
};
130
131
DECLARE_DNSCHED_MODULE(dn_fifo, &fifo_desc);
132
133