1/*	$NetBSD: altq_wfq.h,v 1.5 2006/10/12 19:59:08 peter Exp $	*/
2/*	$KAME: altq_wfq.h,v 1.8 2003/07/10 12:07:49 kjc Exp $	*/
3
4/*
5 * Copyright (C) 1997-2002
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/*
30 *  March 27, 1997.  Written by Hiroshi Kyusojin of Keio University
31 *  (kyu@mt.cs.keio.ac.jp).
32 */
33
34#ifndef _ALTQ_ALTQ_WFQ_H_
35#define	_ALTQ_ALTQ_WFQ_H_
36
37#include <altq/altq.h>
38
39#define	DEFAULT_QSIZE	256
40#define	MAX_QSIZE	2048
41
42struct wfq_interface{
43	char wfq_ifacename[IFNAMSIZ];
44};
45
46struct wfq_getqid{
47	struct wfq_interface 	iface;
48#ifdef ALTQ3_CLFIER_COMPAT
49	struct flowinfo 	flow;
50#endif
51	u_long			qid;
52};
53
54struct wfq_setweight {
55	struct wfq_interface	iface;
56	int 			qid;
57	int 			weight;
58};
59
60typedef struct each_queue_stats {
61	int bytes;		/* bytes in this queue */
62	int weight;		/* weight in percent */
63	struct pktcntr xmit_cnt;
64	struct pktcntr drop_cnt;
65} queue_stats;
66
67struct wfq_getstats {
68	struct wfq_interface	iface;
69	int			qid;
70	queue_stats		stats;
71};
72
73struct wfq_conf {
74	struct wfq_interface	iface;
75	int			hash_policy;	/* hash policy */
76	int			nqueues;	/* number of queues */
77	int			qlimit;		/* queue size in bytes */
78};
79
80#define	WFQ_HASH_DSTADDR	0	/* hash by dst address */
81#define	WFQ_HASH_SRCPORT	1	/* hash by src port */
82#define	WFQ_HASH_FULL		2	/* hash by all fields */
83#define	WFQ_HASH_SRCADDR	3	/* hash by src address */
84
85#define	WFQ_IF_ATTACH		_IOW('Q', 1, struct wfq_interface)
86#define	WFQ_IF_DETACH		_IOW('Q', 2, struct wfq_interface)
87#define	WFQ_ENABLE		_IOW('Q', 3, struct wfq_interface)
88#define	WFQ_DISABLE		_IOW('Q', 4, struct wfq_interface)
89#define	WFQ_CONFIG		_IOWR('Q', 6, struct wfq_conf)
90#define	WFQ_GET_STATS		_IOWR('Q', 12, struct wfq_getstats)
91#define	WFQ_GET_QID		_IOWR('Q', 30, struct wfq_getqid)
92#define	WFQ_SET_WEIGHT		_IOWR('Q', 31, struct wfq_setweight)
93
94#ifdef _KERNEL
95
96#define	HWM			(64 * 1024)
97#define	WFQ_QUOTA		512	/* quota bytes to send at a time */
98#define	WFQ_ADDQUOTA(q)		((q)->quota += WFQ_QUOTA * (q)->weight / 100)
99#define	ENABLE			0
100#define	DISABLE			1
101
102typedef struct weighted_fair_queue{
103	struct weighted_fair_queue *next, *prev;
104	struct mbuf *head, *tail;
105	int bytes;			/* bytes in this queue */
106	int quota;			/* bytes sent in this round */
107	int weight;			/* weight in percent */
108
109	struct pktcntr xmit_cnt;
110	struct pktcntr drop_cnt;
111} wfq;
112
113
114typedef struct wfqstate {
115	struct wfqstate *next;		/* for wfqstate list */
116	struct ifaltq *ifq;
117	int nums;			/* number of queues */
118	int hwm;			/* high water mark */
119	int bytes;			/* total bytes in all the queues */
120	wfq *rrp;			/* round robin pointer */
121	wfq *queue;			/* pointer to queue list */
122#ifdef ALTQ3_CLFIER_COMPAT
123	u_long (*hash_func)(struct flowinfo *, int);
124#endif
125	u_int32_t fbmask;		/* filter bitmask */
126} wfq_state_t;
127
128#endif /* _KERNEL */
129
130#endif /* _ALTQ_ALTQ_WFQ_H */
131