Project

General

Profile

Statistics
| Revision:

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_ */