altq_jobs.h revision 1.1.6.1 1 1.1.6.1 ad /* $NetBSD: altq_jobs.h,v 1.1.6.1 2006/11/18 21:39:03 ad Exp $ */
2 1.1.6.1 ad /* $KAME: altq_jobs.h,v 1.6 2003/07/10 12:07:48 kjc Exp $ */
3 1.1.6.1 ad /*
4 1.1.6.1 ad * Copyright (c) 2001, Rector and Visitors of the University of
5 1.1.6.1 ad * Virginia.
6 1.1.6.1 ad * All rights reserved.
7 1.1.6.1 ad *
8 1.1.6.1 ad * Redistribution and use in source and binary forms,
9 1.1.6.1 ad * with or without modification, are permitted provided
10 1.1.6.1 ad * that the following conditions are met:
11 1.1.6.1 ad *
12 1.1.6.1 ad * Redistributions of source code must retain the above
13 1.1.6.1 ad * copyright notice, this list of conditions and the following
14 1.1.6.1 ad * disclaimer.
15 1.1.6.1 ad *
16 1.1.6.1 ad * Redistributions in binary form must reproduce the above
17 1.1.6.1 ad * copyright notice, this list of conditions and the following
18 1.1.6.1 ad * disclaimer in the documentation and/or other materials provided
19 1.1.6.1 ad * with the distribution.
20 1.1.6.1 ad *
21 1.1.6.1 ad * Neither the name of the University of Virginia nor the names
22 1.1.6.1 ad * of its contributors may be used to endorse or promote products
23 1.1.6.1 ad * derived from this software without specific prior written
24 1.1.6.1 ad * permission.
25 1.1.6.1 ad *
26 1.1.6.1 ad * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
27 1.1.6.1 ad * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
28 1.1.6.1 ad * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
29 1.1.6.1 ad * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30 1.1.6.1 ad * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
31 1.1.6.1 ad * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
32 1.1.6.1 ad * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33 1.1.6.1 ad * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 1.1.6.1 ad * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
35 1.1.6.1 ad * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 1.1.6.1 ad * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
37 1.1.6.1 ad * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
38 1.1.6.1 ad * THE POSSIBILITY OF SUCH DAMAGE.
39 1.1.6.1 ad */
40 1.1.6.1 ad /*
41 1.1.6.1 ad * JoBS - altq prototype implementation
42 1.1.6.1 ad *
43 1.1.6.1 ad * Author: Nicolas Christin <nicolas (at) cs.virginia.edu>
44 1.1.6.1 ad *
45 1.1.6.1 ad * JoBS algorithms originally devised and proposed by
46 1.1.6.1 ad * Nicolas Christin and Jorg Liebeherr.
47 1.1.6.1 ad * Grateful Acknowledgments to Tarek Abdelzaher for his help and
48 1.1.6.1 ad * comments, and to Kenjiro Cho for some helpful advice.
49 1.1.6.1 ad * Contributed by the Multimedia Networks Group at the University
50 1.1.6.1 ad * of Virginia.
51 1.1.6.1 ad *
52 1.1.6.1 ad * Papers and additional info can be found at
53 1.1.6.1 ad * http://qosbox.cs.virginia.edu
54 1.1.6.1 ad *
55 1.1.6.1 ad */
56 1.1.6.1 ad
57 1.1.6.1 ad #ifndef _ALTQ_ALTQ_JOBS_H_
58 1.1.6.1 ad #define _ALTQ_ALTQ_JOBS_H_
59 1.1.6.1 ad
60 1.1.6.1 ad #include <altq/altq.h>
61 1.1.6.1 ad #include <altq/altq_classq.h>
62 1.1.6.1 ad
63 1.1.6.1 ad #ifdef __cplusplus
64 1.1.6.1 ad extern "C" {
65 1.1.6.1 ad #endif
66 1.1.6.1 ad
67 1.1.6.1 ad #define JOBS_MAXPRI 16 /* upper limit on the number of priorities */
68 1.1.6.1 ad #define SCALE_RATE 32
69 1.1.6.1 ad #define SCALE_LOSS 32
70 1.1.6.1 ad #define SCALE_SHARE 16
71 1.1.6.1 ad #define GRANULARITY 1000000 /* microseconds */
72 1.1.6.1 ad #define INFINITY LLONG_MAX
73 1.1.6.1 ad
74 1.1.6.1 ad /* list of packet arrival times */
75 1.1.6.1 ad struct _tsentry;
76 1.1.6.1 ad typedef TAILQ_HEAD(_timestamps, _tsentry) TSLIST;
77 1.1.6.1 ad typedef struct _tsentry {
78 1.1.6.1 ad TAILQ_ENTRY(_tsentry) ts_list;
79 1.1.6.1 ad uint64_t timestamp;
80 1.1.6.1 ad } TSENTRY;
81 1.1.6.1 ad
82 1.1.6.1 ad /*
83 1.1.6.1 ad * timestamp list macros
84 1.1.6.1 ad */
85 1.1.6.1 ad
86 1.1.6.1 ad #define tslist_first(s) TAILQ_FIRST(s)
87 1.1.6.1 ad #define tslist_last(s) TAILQ_LAST(s, _timestamps)
88 1.1.6.1 ad #define tslist_empty(s) TAILQ_EMPTY(s)
89 1.1.6.1 ad
90 1.1.6.1 ad /*
91 1.1.6.1 ad * scaling/conversion macros
92 1.1.6.1 ad * none of these macros present side-effects, hence the lowercase
93 1.1.6.1 ad */
94 1.1.6.1 ad
95 1.1.6.1 ad #define secs_to_ticks(x) ((x) * machclk_freq)
96 1.1.6.1 ad #define ticks_to_secs(x) ((x) / machclk_freq)
97 1.1.6.1 ad #define invsecs_to_invticks(x) ticks_to_secs(x)
98 1.1.6.1 ad #define invticks_to_invsecs(x) secs_to_ticks(x)
99 1.1.6.1 ad #define bits_to_bytes(x) ((x) >> 3)
100 1.1.6.1 ad #define bytes_to_bits(x) ((x) << 3)
101 1.1.6.1 ad #define scale_rate(x) ((x) << SCALE_RATE)
102 1.1.6.1 ad #define unscale_rate(x) ((x) >> SCALE_RATE)
103 1.1.6.1 ad #define bps_to_internal(x) (invsecs_to_invticks(bits_to_bytes(scale_rate(x))))
104 1.1.6.1 ad #define internal_to_bps(x) (unscale_rate(invticks_to_invsecs(bytes_to_bits(x))))
105 1.1.6.1 ad
106 1.1.6.1 ad /*
107 1.1.6.1 ad * this macro takes care of possible wraparound
108 1.1.6.1 ad * effects in the computation of a delay
109 1.1.6.1 ad * no side-effects here either
110 1.1.6.1 ad */
111 1.1.6.1 ad
112 1.1.6.1 ad #define delay_diff(x, y) ((x >= y)?(x - y):((ULLONG_MAX-y)+x+1))
113 1.1.6.1 ad
114 1.1.6.1 ad /*
115 1.1.6.1 ad * additional macros (PKTCNTR_ADD can be found
116 1.1.6.1 ad * in the original distribution)
117 1.1.6.1 ad */
118 1.1.6.1 ad
119 1.1.6.1 ad #define PKTCNTR_SUB(cntr, len) do { \
120 1.1.6.1 ad (cntr)->packets--; \
121 1.1.6.1 ad (cntr)->bytes -= len; \
122 1.1.6.1 ad } while (/*CONSTCOND*/ 0)
123 1.1.6.1 ad
124 1.1.6.1 ad #define PKTCNTR_RESET(cntr) do { \
125 1.1.6.1 ad (cntr)->packets = 0; \
126 1.1.6.1 ad (cntr)->bytes = 0; \
127 1.1.6.1 ad } while (/*CONSTCOND*/ 0)
128 1.1.6.1 ad
129 1.1.6.1 ad struct jobs_interface {
130 1.1.6.1 ad char jobs_ifname[IFNAMSIZ]; /* interface name (e.g., fxp0) */
131 1.1.6.1 ad u_long arg; /* request-specific argument */
132 1.1.6.1 ad };
133 1.1.6.1 ad struct jobs_attach {
134 1.1.6.1 ad struct jobs_interface iface;
135 1.1.6.1 ad u_int bandwidth; /* link bandwidth in bits/sec */
136 1.1.6.1 ad u_int qlimit; /* buffer size in packets */
137 1.1.6.1 ad u_int separate; /* separate buffers flag */
138 1.1.6.1 ad };
139 1.1.6.1 ad
140 1.1.6.1 ad struct jobs_add_class {
141 1.1.6.1 ad struct jobs_interface iface;
142 1.1.6.1 ad int pri; /* priority (0 is the lowest) */
143 1.1.6.1 ad int flags; /* misc flags (see below) */
144 1.1.6.1 ad
145 1.1.6.1 ad /*
146 1.1.6.1 ad * Delay Bound (-1 = NO ADC) is provided in us,
147 1.1.6.1 ad * and is converted to clock ticks
148 1.1.6.1 ad */
149 1.1.6.1 ad int64_t cl_adc;
150 1.1.6.1 ad
151 1.1.6.1 ad /*
152 1.1.6.1 ad * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1
153 1.1.6.1 ad * and is converted to a fraction of 2^(SCALE_LOSS)
154 1.1.6.1 ad */
155 1.1.6.1 ad int64_t cl_alc;
156 1.1.6.1 ad
157 1.1.6.1 ad /*
158 1.1.6.1 ad * lower bound on throughput (-1 = no ARC)
159 1.1.6.1 ad * is provided in (string) and
160 1.1.6.1 ad * is converted to internal format
161 1.1.6.1 ad */
162 1.1.6.1 ad int64_t cl_arc;
163 1.1.6.1 ad
164 1.1.6.1 ad /* RDC weight (-1 = NO RDC) - no unit */
165 1.1.6.1 ad int64_t cl_rdc;
166 1.1.6.1 ad
167 1.1.6.1 ad /* RLC weight (-1 = NO RLC) - no unit */
168 1.1.6.1 ad int64_t cl_rlc;
169 1.1.6.1 ad
170 1.1.6.1 ad u_long class_handle; /* return value */
171 1.1.6.1 ad };
172 1.1.6.1 ad
173 1.1.6.1 ad /* jobs class flags */
174 1.1.6.1 ad #define JOCF_CLEARDSCP 0x0010 /* clear diffserv codepoint */
175 1.1.6.1 ad #define JOCF_DEFAULTCLASS 0x1000 /* default class */
176 1.1.6.1 ad
177 1.1.6.1 ad /* special class handles */
178 1.1.6.1 ad #define JOBS_NULLCLASS_HANDLE 0
179 1.1.6.1 ad
180 1.1.6.1 ad struct jobs_delete_class {
181 1.1.6.1 ad struct jobs_interface iface;
182 1.1.6.1 ad u_long class_handle;
183 1.1.6.1 ad };
184 1.1.6.1 ad
185 1.1.6.1 ad struct jobs_modify_class {
186 1.1.6.1 ad struct jobs_interface iface;
187 1.1.6.1 ad u_long class_handle;
188 1.1.6.1 ad int pri;
189 1.1.6.1 ad
190 1.1.6.1 ad /*
191 1.1.6.1 ad * Delay Bound (-1 = NO ADC) is provided in us,
192 1.1.6.1 ad * and is converted to clock ticks
193 1.1.6.1 ad */
194 1.1.6.1 ad int64_t cl_adc;
195 1.1.6.1 ad
196 1.1.6.1 ad /*
197 1.1.6.1 ad * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1
198 1.1.6.1 ad * and is converted to a fraction of 2^(SCALE_LOSS)
199 1.1.6.1 ad */
200 1.1.6.1 ad int64_t cl_alc;
201 1.1.6.1 ad
202 1.1.6.1 ad /*
203 1.1.6.1 ad * lower bound on throughput (-1 = no ARC)
204 1.1.6.1 ad * is provided in (string) and
205 1.1.6.1 ad * is converted to internal format
206 1.1.6.1 ad */
207 1.1.6.1 ad int64_t cl_arc;
208 1.1.6.1 ad
209 1.1.6.1 ad /* RDC weight (-1 = NO RDC) - no unit */
210 1.1.6.1 ad int64_t cl_rdc;
211 1.1.6.1 ad
212 1.1.6.1 ad /* RLC weight (-1 = NO RLC) - no unit */
213 1.1.6.1 ad int64_t cl_rlc;
214 1.1.6.1 ad
215 1.1.6.1 ad int flags;
216 1.1.6.1 ad };
217 1.1.6.1 ad
218 1.1.6.1 ad struct jobs_add_filter {
219 1.1.6.1 ad struct jobs_interface iface;
220 1.1.6.1 ad u_long class_handle;
221 1.1.6.1 ad #ifdef ALTQ3_CLFIER_COMPAT
222 1.1.6.1 ad struct flow_filter filter;
223 1.1.6.1 ad #endif
224 1.1.6.1 ad u_long filter_handle; /* return value */
225 1.1.6.1 ad };
226 1.1.6.1 ad
227 1.1.6.1 ad struct jobs_delete_filter {
228 1.1.6.1 ad struct jobs_interface iface;
229 1.1.6.1 ad u_long filter_handle;
230 1.1.6.1 ad };
231 1.1.6.1 ad
232 1.1.6.1 ad struct class_stats {
233 1.1.6.1 ad u_int adc_violations;
234 1.1.6.1 ad u_int totallength;
235 1.1.6.1 ad u_int period;
236 1.1.6.1 ad u_int qlength;
237 1.1.6.1 ad
238 1.1.6.1 ad u_long class_handle;
239 1.1.6.1 ad
240 1.1.6.1 ad int64_t service_rate; /* bps that should be out */
241 1.1.6.1 ad
242 1.1.6.1 ad u_int64_t avg_cycles_dequeue;
243 1.1.6.1 ad u_int64_t avg_cycles_enqueue;
244 1.1.6.1 ad u_int64_t avg_cycles2_dequeue;
245 1.1.6.1 ad u_int64_t avg_cycles2_enqueue;
246 1.1.6.1 ad u_int64_t avgdel; /* in us */
247 1.1.6.1 ad u_int64_t bc_cycles_dequeue;
248 1.1.6.1 ad u_int64_t bc_cycles_enqueue;
249 1.1.6.1 ad u_int64_t busylength; /* in ms */
250 1.1.6.1 ad u_int64_t lastdel; /* in us */
251 1.1.6.1 ad u_int64_t total_dequeued;
252 1.1.6.1 ad u_int64_t total_enqueued;
253 1.1.6.1 ad u_int64_t wc_cycles_dequeue;
254 1.1.6.1 ad u_int64_t wc_cycles_enqueue;
255 1.1.6.1 ad
256 1.1.6.1 ad struct pktcntr arrival; /* rin+dropped */
257 1.1.6.1 ad struct pktcntr arrivalbusy;
258 1.1.6.1 ad struct pktcntr rin; /* dropped packet counter */
259 1.1.6.1 ad struct pktcntr rout; /* transmitted packet counter */
260 1.1.6.1 ad struct pktcntr dropcnt; /* dropped packet counter */
261 1.1.6.1 ad };
262 1.1.6.1 ad
263 1.1.6.1 ad struct jobs_class_stats {
264 1.1.6.1 ad struct class_stats *stats; /* pointer to stats array */
265 1.1.6.1 ad int maxpri; /* in/out */
266 1.1.6.1 ad struct jobs_interface iface;
267 1.1.6.1 ad };
268 1.1.6.1 ad
269 1.1.6.1 ad #define JOBS_IF_ATTACH _IOW('Q', 1, struct jobs_attach)
270 1.1.6.1 ad #define JOBS_IF_DETACH _IOW('Q', 2, struct jobs_interface)
271 1.1.6.1 ad #define JOBS_ENABLE _IOW('Q', 3, struct jobs_interface)
272 1.1.6.1 ad #define JOBS_DISABLE _IOW('Q', 4, struct jobs_interface)
273 1.1.6.1 ad #define JOBS_CLEAR _IOW('Q', 6, struct jobs_interface)
274 1.1.6.1 ad #define JOBS_ADD_CLASS _IOWR('Q', 7, struct jobs_add_class)
275 1.1.6.1 ad #define JOBS_DEL_CLASS _IOW('Q', 8, struct jobs_delete_class)
276 1.1.6.1 ad #define JOBS_MOD_CLASS _IOW('Q', 9, struct jobs_modify_class)
277 1.1.6.1 ad #define JOBS_ADD_FILTER _IOWR('Q', 10, struct jobs_add_filter)
278 1.1.6.1 ad #define JOBS_DEL_FILTER _IOW('Q', 11, struct jobs_delete_filter)
279 1.1.6.1 ad #define JOBS_GETSTATS _IOWR('Q', 12, struct jobs_class_stats)
280 1.1.6.1 ad
281 1.1.6.1 ad #ifdef _KERNEL
282 1.1.6.1 ad
283 1.1.6.1 ad struct jobs_class {
284 1.1.6.1 ad TSLIST *arv_tm; /* list of timestamps */
285 1.1.6.1 ad struct jobs_if *cl_jif; /* back pointer to jif */
286 1.1.6.1 ad class_queue_t *cl_q; /* class queue structure */
287 1.1.6.1 ad
288 1.1.6.1 ad int cl_pri; /* priority */
289 1.1.6.1 ad int cl_flags; /* class flags */
290 1.1.6.1 ad
291 1.1.6.1 ad u_long cl_handle; /* class handle */
292 1.1.6.1 ad
293 1.1.6.1 ad /* control variables */
294 1.1.6.1 ad
295 1.1.6.1 ad /*
296 1.1.6.1 ad * internal representation:
297 1.1.6.1 ad * bytes/unit_time << 32 = (bps /8 << 32)*1/machclk_freq
298 1.1.6.1 ad */
299 1.1.6.1 ad int64_t service_rate; /* bps that should be out */
300 1.1.6.1 ad int64_t min_rate_adc; /* bps that should be out for ADC/ARC */
301 1.1.6.1 ad
302 1.1.6.1 ad u_int64_t current_loss; /* % of packets dropped */
303 1.1.6.1 ad u_int64_t cl_lastdel; /* in clock ticks */
304 1.1.6.1 ad u_int64_t cl_avgdel;
305 1.1.6.1 ad
306 1.1.6.1 ad /* statistics */
307 1.1.6.1 ad u_int cl_period; /* backlog period */
308 1.1.6.1 ad struct pktcntr cl_arrival; /* arrived packet counter */
309 1.1.6.1 ad struct pktcntr cl_dropcnt; /* dropped packet counter */
310 1.1.6.1 ad struct pktcntr cl_rin; /* let in packet counter */
311 1.1.6.1 ad struct pktcntr cl_rout; /* transmitted packet counter */
312 1.1.6.1 ad
313 1.1.6.1 ad
314 1.1.6.1 ad /* modified deficit round-robin specific variables */
315 1.1.6.1 ad
316 1.1.6.1 ad /*
317 1.1.6.1 ad * rout_th is SCALED for precision, as opposed to rout.
318 1.1.6.1 ad */
319 1.1.6.1 ad int64_t st_service_rate;
320 1.1.6.1 ad u_int64_t cl_last_rate_update;
321 1.1.6.1 ad struct pktcntr cl_rout_th; /* theoretical transmissions */
322 1.1.6.1 ad struct pktcntr st_arrival; /* rin+dropped */
323 1.1.6.1 ad struct pktcntr st_rin; /* dropped packet counter */
324 1.1.6.1 ad struct pktcntr st_rout; /* transmitted packet counter */
325 1.1.6.1 ad struct pktcntr st_dropcnt; /* dropped packet counter */
326 1.1.6.1 ad
327 1.1.6.1 ad /* service guarantees */
328 1.1.6.1 ad u_int adc_violations;
329 1.1.6.1 ad int concerned_adc;
330 1.1.6.1 ad int concerned_alc;
331 1.1.6.1 ad int concerned_arc;
332 1.1.6.1 ad int concerned_rdc;
333 1.1.6.1 ad int concerned_rlc;
334 1.1.6.1 ad /*
335 1.1.6.1 ad * Delay Bound (-1 = NO ADC) is provided in us,
336 1.1.6.1 ad * and is converted to clock ticks
337 1.1.6.1 ad */
338 1.1.6.1 ad int64_t cl_adc;
339 1.1.6.1 ad
340 1.1.6.1 ad /*
341 1.1.6.1 ad * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1
342 1.1.6.1 ad * and is converted to a fraction of 2^(SCALE_LOSS)
343 1.1.6.1 ad */
344 1.1.6.1 ad int64_t cl_alc;
345 1.1.6.1 ad
346 1.1.6.1 ad /*
347 1.1.6.1 ad * lower bound on throughput (-1 = no ARC)
348 1.1.6.1 ad * is provided in (string) and
349 1.1.6.1 ad * is converted to internal format
350 1.1.6.1 ad */
351 1.1.6.1 ad int64_t cl_arc;
352 1.1.6.1 ad
353 1.1.6.1 ad /* RDC weight (-1 = NO RDC) - no unit */
354 1.1.6.1 ad int64_t cl_rdc;
355 1.1.6.1 ad
356 1.1.6.1 ad /* RLC weight (-1 = NO RLC) - no unit */
357 1.1.6.1 ad int64_t cl_rlc;
358 1.1.6.1 ad
359 1.1.6.1 ad u_int64_t delay_prod_others;
360 1.1.6.1 ad u_int64_t loss_prod_others;
361 1.1.6.1 ad u_int64_t idletime;
362 1.1.6.1 ad };
363 1.1.6.1 ad
364 1.1.6.1 ad /*
365 1.1.6.1 ad * jobs interface state
366 1.1.6.1 ad */
367 1.1.6.1 ad struct jobs_if {
368 1.1.6.1 ad struct jobs_if *jif_next; /* interface state list */
369 1.1.6.1 ad struct ifaltq *jif_ifq; /* backpointer to ifaltq */
370 1.1.6.1 ad struct jobs_class *jif_default; /* default class */
371 1.1.6.1 ad struct jobs_class *jif_classes[JOBS_MAXPRI]; /* classes */
372 1.1.6.1 ad #ifdef ALTQ3_CLFIER_COMPAT
373 1.1.6.1 ad struct acc_classifier jif_classifier; /* classifier */
374 1.1.6.1 ad #endif
375 1.1.6.1 ad int jif_maxpri; /* max priority in use */
376 1.1.6.1 ad
377 1.1.6.1 ad u_int jif_bandwidth; /* link bandwidth in bps */
378 1.1.6.1 ad u_int jif_qlimit; /* buffer size in packets */
379 1.1.6.1 ad u_int jif_separate; /* separate buffers or not */
380 1.1.6.1 ad u_int64_t avg_cycles_dequeue;
381 1.1.6.1 ad u_int64_t avg_cycles_enqueue;
382 1.1.6.1 ad u_int64_t avg_cycles2_dequeue;
383 1.1.6.1 ad u_int64_t avg_cycles2_enqueue;
384 1.1.6.1 ad u_int64_t bc_cycles_dequeue;
385 1.1.6.1 ad u_int64_t bc_cycles_enqueue;
386 1.1.6.1 ad u_int64_t wc_cycles_dequeue;
387 1.1.6.1 ad u_int64_t wc_cycles_enqueue;
388 1.1.6.1 ad u_int64_t total_dequeued;
389 1.1.6.1 ad u_int64_t total_enqueued;
390 1.1.6.1 ad };
391 1.1.6.1 ad
392 1.1.6.1 ad #endif /* _KERNEL */
393 1.1.6.1 ad
394 1.1.6.1 ad #ifdef __cplusplus
395 1.1.6.1 ad }
396 1.1.6.1 ad #endif
397 1.1.6.1 ad
398 1.1.6.1 ad #endif /* _ALTQ_ALTQ_JOBS_H_ */
399