root / lab4 / .minix-src / include / altq / if_altq.h @ 14
History | View | Annotate | Download (6.51 KB)
1 | 13 | up20180614 | /* $NetBSD: if_altq.h,v 1.14 2014/07/01 10:16:02 ozaki-r Exp $ */
|
---|---|---|---|
2 | /* $KAME: if_altq.h,v 1.12 2005/04/13 03:44:25 suz Exp $ */
|
||
3 | |||
4 | /*
|
||
5 | * Copyright (C) 1997-2003
|
||
6 | * Sony Computer Science Laboratories Inc. All rights reserved.
|
||
7 | *
|
||
8 | * Redistribution and use in source and binary forms, with or without
|
||
9 | * modification, are permitted provided that the following conditions
|
||
10 | * are met:
|
||
11 | * 1. Redistributions of source code must retain the above copyright
|
||
12 | * notice, this list of conditions and the following disclaimer.
|
||
13 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
14 | * notice, this list of conditions and the following disclaimer in the
|
||
15 | * documentation and/or other materials provided with the distribution.
|
||
16 | *
|
||
17 | * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
|
||
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
20 | * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
|
||
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
27 | * SUCH DAMAGE.
|
||
28 | */
|
||
29 | #ifndef _ALTQ_IF_ALTQ_H_
|
||
30 | #define _ALTQ_IF_ALTQ_H_
|
||
31 | |||
32 | #if defined(_KERNEL_OPT)
|
||
33 | #include "opt_altq_enabled.h" |
||
34 | #endif
|
||
35 | |||
36 | struct altq_pktattr; struct tb_regulator; struct top_cdnr; |
||
37 | |||
38 | /*
|
||
39 | * Structure defining a queue for a network interface.
|
||
40 | */
|
||
41 | struct ifaltq {
|
||
42 | /* fields compatible with struct ifqueue */
|
||
43 | struct mbuf *ifq_head;
|
||
44 | struct mbuf *ifq_tail;
|
||
45 | int ifq_len;
|
||
46 | int ifq_maxlen;
|
||
47 | int ifq_drops;
|
||
48 | kmutex_t *ifq_lock; |
||
49 | |||
50 | /* alternate queueing related fields */
|
||
51 | int altq_type; /* discipline type */ |
||
52 | int altq_flags; /* flags (e.g. ready, in-use) */ |
||
53 | void *altq_disc; /* for discipline-specific use */ |
||
54 | struct ifnet *altq_ifp; /* back pointer to interface */ |
||
55 | |||
56 | int (*altq_enqueue)(struct ifaltq *, struct mbuf *, |
||
57 | struct altq_pktattr *);
|
||
58 | struct mbuf *(*altq_dequeue)(struct ifaltq *, int); |
||
59 | int (*altq_request)(struct ifaltq *, int, void *); |
||
60 | |||
61 | /* classifier fields */
|
||
62 | void *altq_clfier; /* classifier-specific use */ |
||
63 | void *(*altq_classify)(void *, struct mbuf *, int); |
||
64 | |||
65 | /* token bucket regulator */
|
||
66 | struct tb_regulator *altq_tbr;
|
||
67 | |||
68 | /* input traffic conditioner (doesn't belong to the output queue...) */
|
||
69 | struct top_cdnr *altq_cdnr;
|
||
70 | }; |
||
71 | |||
72 | |||
73 | #ifdef _KERNEL
|
||
74 | |||
75 | /*
|
||
76 | * packet attributes used by queueing disciplines.
|
||
77 | * pattr_class is a discipline-dependent scheduling class that is
|
||
78 | * set by a classifier.
|
||
79 | * pattr_hdr and pattr_af may be used by a discipline to access
|
||
80 | * the header within a mbuf. (e.g. ECN needs to update the CE bit)
|
||
81 | * note that pattr_hdr could be stale after m_pullup, though link
|
||
82 | * layer output routines usually don't use m_pullup. link-level
|
||
83 | * compression also invalidates these fields. thus, pattr_hdr needs
|
||
84 | * to be verified when a discipline touches the header.
|
||
85 | */
|
||
86 | struct altq_pktattr {
|
||
87 | void *pattr_class; /* sched class set by classifier */ |
||
88 | int pattr_af; /* address family */ |
||
89 | void * pattr_hdr; /* saved header position in mbuf */ |
||
90 | }; |
||
91 | |||
92 | /*
|
||
93 | * mbuf tag to carry a queue id (and hints for ECN).
|
||
94 | */
|
||
95 | struct altq_tag {
|
||
96 | u_int32_t qid; /* queue id */
|
||
97 | /* hints for ecn */
|
||
98 | int af; /* address family */ |
||
99 | void *hdr; /* saved header position in mbuf */ |
||
100 | }; |
||
101 | |||
102 | /*
|
||
103 | * a token-bucket regulator limits the rate that a network driver can
|
||
104 | * dequeue packets from the output queue.
|
||
105 | * modern cards are able to buffer a large amount of packets and dequeue
|
||
106 | * too many packets at a time. this bursty dequeue behavior makes it
|
||
107 | * impossible to schedule packets by queueing disciplines.
|
||
108 | * a token-bucket is used to control the burst size in a device
|
||
109 | * independent manner.
|
||
110 | */
|
||
111 | struct tb_regulator {
|
||
112 | int64_t tbr_rate; /* (scaled) token bucket rate */
|
||
113 | int64_t tbr_depth; /* (scaled) token bucket depth */
|
||
114 | |||
115 | int64_t tbr_token; /* (scaled) current token */
|
||
116 | int64_t tbr_filluptime; /* (scaled) time to fill up bucket */
|
||
117 | u_int64_t tbr_last; /* last time token was updated */
|
||
118 | |||
119 | int tbr_lastop; /* last dequeue operation type |
||
120 | needed for poll-and-dequeue */
|
||
121 | }; |
||
122 | |||
123 | /* if_altqflags */
|
||
124 | #define ALTQF_READY 0x01 /* driver supports alternate queueing */ |
||
125 | #define ALTQF_ENABLED 0x02 /* altq is in use */ |
||
126 | #define ALTQF_CLASSIFY 0x04 /* classify packets */ |
||
127 | #define ALTQF_CNDTNING 0x08 /* altq traffic conditioning is enabled */ |
||
128 | #define ALTQF_DRIVER1 0x40 /* driver specific */ |
||
129 | |||
130 | /* if_altqflags set internally only: */
|
||
131 | #define ALTQF_CANTCHANGE (ALTQF_READY)
|
||
132 | |||
133 | /* altq_dequeue 2nd arg */
|
||
134 | #define ALTDQ_REMOVE 1 /* dequeue mbuf from the queue */ |
||
135 | #define ALTDQ_POLL 2 /* don't dequeue mbuf from the queue */ |
||
136 | |||
137 | /* altq request types (currently only purge is defined) */
|
||
138 | #define ALTRQ_PURGE 1 /* purge all packets */ |
||
139 | |||
140 | #define ALTQ_IS_READY(ifq) ((ifq)->altq_flags & ALTQF_READY)
|
||
141 | #define ALTQ_IS_ENABLED(ifq) ((ifq)->altq_flags & ALTQF_ENABLED)
|
||
142 | #define ALTQ_NEEDS_CLASSIFY(ifq) ((ifq)->altq_flags & ALTQF_CLASSIFY)
|
||
143 | #define ALTQ_IS_CNDTNING(ifq) ((ifq)->altq_flags & ALTQF_CNDTNING)
|
||
144 | |||
145 | #define ALTQ_SET_CNDTNING(ifq) ((ifq)->altq_flags |= ALTQF_CNDTNING)
|
||
146 | #define ALTQ_CLEAR_CNDTNING(ifq) ((ifq)->altq_flags &= ~ALTQF_CNDTNING)
|
||
147 | #define ALTQ_IS_ATTACHED(ifq) ((ifq)->altq_disc != NULL) |
||
148 | |||
149 | #define ALTQ_ENQUEUE(ifq, m, pa, err) \
|
||
150 | (err) = (*(ifq)->altq_enqueue)((ifq),(m),(pa)) |
||
151 | #define ALTQ_DEQUEUE(ifq, m) \
|
||
152 | (m) = (*(ifq)->altq_dequeue)((ifq), ALTDQ_REMOVE) |
||
153 | #define ALTQ_POLL(ifq, m) \
|
||
154 | (m) = (*(ifq)->altq_dequeue)((ifq), ALTDQ_POLL) |
||
155 | #define ALTQ_PURGE(ifq) \
|
||
156 | (void)(*(ifq)->altq_request)((ifq), ALTRQ_PURGE, (void *)0) |
||
157 | #define ALTQ_IS_EMPTY(ifq) ((ifq)->ifq_len == 0) |
||
158 | #define TBR_IS_ENABLED(ifq) ((ifq)->altq_tbr != NULL) |
||
159 | |||
160 | extern int altq_attach(struct ifaltq *, int, void *, |
||
161 | int (*)(struct ifaltq *, struct mbuf *, |
||
162 | struct altq_pktattr *),
|
||
163 | struct mbuf *(*)(struct ifaltq *, int), |
||
164 | int (*)(struct ifaltq *, int, void *), |
||
165 | void *,
|
||
166 | void *(*)(void *, struct mbuf *, int)); |
||
167 | extern int altq_detach(struct ifaltq *); |
||
168 | extern int altq_enable(struct ifaltq *); |
||
169 | extern int altq_disable(struct ifaltq *); |
||
170 | extern struct mbuf *tbr_dequeue(struct ifaltq *, int); |
||
171 | extern int (*altq_input)(struct mbuf *, int); |
||
172 | #if 1 /* ALTQ3_CLFIER_COMPAT */ |
||
173 | void altq_etherclassify(struct ifaltq *, struct mbuf *, struct altq_pktattr *); |
||
174 | #endif
|
||
175 | #endif /* _KERNEL */ |
||
176 | |||
177 | #endif /* _ALTQ_IF_ALTQ_H_ */ |