summaryrefslogtreecommitdiff
path: root/sys/altq/altq_rio.h
blob: e96411f7a1b3f79d77c7ed8eede4ba9c31c64731 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*	$OpenBSD: altq_rio.h,v 1.2 2002/03/14 01:26:26 millert Exp $	*/
/*	$KAME: altq_rio.h,v 1.5 2000/12/14 08:12:46 thorpej Exp $	*/

/*
 * Copyright (C) 1998-2000
 *	Sony Computer Science Laboratories Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef _ALTQ_ALTQ_RIO_H_
#define	_ALTQ_ALTQ_RIO_H_

#include <altq/altq_classq.h>

/*
 * RIO: RED with IN/OUT bit
 * (extended to support more than 2 drop precedence values)
 */
#define	RIO_NDROPPREC	3	/* number of drop precedence values */

struct rio_interface {
	char	rio_ifname[IFNAMSIZ];
};

struct rio_stats {
	struct rio_interface iface;
	int q_len[RIO_NDROPPREC];
	struct redstats q_stats[RIO_NDROPPREC];

	/* static red parameters */
	int q_limit;
	int weight;
	int flags;
	struct redparams q_params[RIO_NDROPPREC];
};

struct rio_conf {
	struct rio_interface iface;
	struct redparams q_params[RIO_NDROPPREC];
	int rio_weight;		/* weight for EWMA */
	int rio_limit;		/* max queue length */
	int rio_pkttime;	/* average packet time in usec */
	int rio_flags;		/* see below */
};

/* rio flags */
#define	RIOF_ECN4	0x01	/* use packet marking for IPv4 packets */
#define	RIOF_ECN6	0x02	/* use packet marking for IPv6 packets */
#define	RIOF_ECN	(RIOF_ECN4 | RIOF_ECN6)
#define	RIOF_CLEARDSCP	0x200	/* clear diffserv codepoint */

/* 
 * IOCTLs for RIO
 */
#define	RIO_IF_ATTACH		_IOW('Q', 1, struct rio_interface)
#define	RIO_IF_DETACH		_IOW('Q', 2, struct rio_interface)
#define	RIO_ENABLE		_IOW('Q', 3, struct rio_interface)
#define	RIO_DISABLE		_IOW('Q', 4, struct rio_interface)
#define	RIO_CONFIG		_IOWR('Q', 6, struct rio_conf)
#define	RIO_GETSTATS		_IOWR('Q', 12, struct rio_stats)
#define	RIO_SETDEFAULTS		_IOW('Q', 30, struct redparams[RIO_NDROPPREC])

#ifdef _KERNEL

typedef struct rio {
	/* per drop precedence structure */
	struct dropprec_state {
		/* red parameters */
		int inv_pmax;	/* inverse of max drop probability */
		int th_min;	/* red min threshold */
		int th_max;	/* red max threshold */

		/* variables for internal use */
		int th_min_s;	/* th_min scaled by avgshift */
		int th_max_s;	/* th_max scaled by avgshift */
		int probd;	/* drop probability denominator */

		int qlen;	/* queue length */
		int avg;	/* (scaled) queue length average */
		int count; 	/* packet count since the last dropped/marked
				   packet */
		int idle;	/* queue was empty */
		int old;	/* avg is above th_min */
		struct timeval last;  /* timestamp when queue becomes idle */
	} rio_precstate[RIO_NDROPPREC];
		
	int rio_wshift;		/* log(red_weight) */
	int rio_weight;		/* weight for EWMA */
	struct wtab *rio_wtab;	/* weight table */

	int rio_pkttime; 	/* average packet time in micro sec
				   used for idle calibration */
	int rio_flags;		/* rio flags */

	u_int8_t rio_codepoint;		/* codepoint value to tag packets */
	u_int8_t rio_codepointmask;	/* codepoint mask bits */
	
	struct redstats q_stats[RIO_NDROPPREC];	/* statistics */
} rio_t;

typedef struct rio_queue {
	struct rio_queue *rq_next;	/* next red_state in the list */
	struct ifaltq *rq_ifq;		/* backpointer to ifaltq */

	class_queue_t *rq_q;

	rio_t *rq_rio;
} rio_queue_t;

extern rio_t *rio_alloc(int, struct redparams *, int, int);
extern void rio_destroy(rio_t *);
extern void rio_getstats(rio_t *, struct redstats *);
extern int rio_addq(rio_t *, class_queue_t *, struct mbuf *,
			 struct altq_pktattr *);
extern struct mbuf *rio_getq(rio_t *, class_queue_t *);
extern int rio_set_meter(rio_t *, int, int, int);

#endif /* _KERNEL */

#endif /* _ALTQ_ALTQ_RIO_H_ */