master
  1/*-
  2 * Copyright (C) 1997-2003
  3 *	Sony Computer Science Laboratories Inc.  All rights reserved.
  4 *
  5 * Redistribution and use in source and binary forms, with or without
  6 * modification, are permitted provided that the following conditions
  7 * are met:
  8 * 1. Redistributions of source code must retain the above copyright
  9 *    notice, this list of conditions and the following disclaimer.
 10 * 2. Redistributions in binary form must reproduce the above copyright
 11 *    notice, this list of conditions and the following disclaimer in the
 12 *    documentation and/or other materials provided with the distribution.
 13 *
 14 * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 17 * ARE DISCLAIMED.  IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 24 * SUCH DAMAGE.
 25 *
 26 * $KAME: altq_red.h,v 1.8 2003/07/10 12:07:49 kjc Exp $
 27 */
 28
 29#ifndef _ALTQ_ALTQ_RED_H_
 30#define	_ALTQ_ALTQ_RED_H_
 31
 32#include <net/altq/altq_classq.h>
 33
 34/* red flags */
 35#define	REDF_ECN4	0x01	/* use packet marking for IPv4 packets */
 36#define	REDF_ECN6	0x02	/* use packet marking for IPv6 packets */
 37#define	REDF_ECN	(REDF_ECN4 | REDF_ECN6)
 38#define	REDF_FLOWVALVE	0x04	/* use flowvalve (aka penalty-box) */
 39
 40/*
 41 * simpler versions of red parameters and statistics used by other
 42 * disciplines (e.g., CBQ)
 43 */
 44struct redparams {
 45	int th_min;		/* red min threshold */
 46	int th_max;		/* red max threshold */
 47	int inv_pmax;		/* inverse of max drop probability */
 48};
 49
 50struct redstats {
 51	int		q_avg;
 52	struct pktcntr	xmit_cnt;
 53	struct pktcntr	drop_cnt;
 54	u_int		drop_forced;
 55	u_int		drop_unforced;
 56	u_int		marked_packets;
 57};
 58
 59#ifdef _KERNEL
 60
 61/* weight table structure for idle time calibration */
 62struct wtab {
 63	struct wtab	*w_next;
 64	int		 w_weight;
 65	int		 w_param_max;
 66	int		 w_refcount;
 67	int32_t		 w_tab[32];
 68};
 69
 70typedef struct red {
 71	int		red_pkttime;	/* average packet time in micro sec
 72					   used for idle calibration */
 73	int		red_flags;	/* red flags */
 74
 75	/* red parameters */
 76	int		red_weight;	/* weight for EWMA */
 77	int		red_inv_pmax;	/* inverse of max drop probability */
 78	int		red_thmin;	/* red min threshold */
 79	int		red_thmax;	/* red max threshold */
 80
 81	/* variables for internal use */
 82	int		red_wshift;	/* log(red_weight) */
 83	int		red_thmin_s;	/* th_min scaled by avgshift */
 84	int		red_thmax_s;	/* th_max scaled by avgshift */
 85	int		red_probd;	/* drop probability denominator */
 86
 87	int		red_avg;	/* queue len avg scaled by avgshift */
 88	int		red_count;	/* packet count since last dropped/
 89					   marked packet */
 90	int		red_idle;	/* queue was empty */
 91	int		red_old;	/* avg is above th_min */
 92	struct wtab	*red_wtab;	/* weight table */
 93	struct timeval	 red_last;	/* time when the queue becomes idle */
 94
 95	struct {
 96		struct pktcntr	xmit_cnt;
 97		struct pktcntr	drop_cnt;
 98		u_int		drop_forced;
 99		u_int		drop_unforced;
100		u_int		marked_packets;
101	} red_stats;
102} red_t;
103
104/* red drop types */
105#define	DTYPE_NODROP	0	/* no drop */
106#define	DTYPE_FORCED	1	/* a "forced" drop */
107#define	DTYPE_EARLY	2	/* an "unforced" (early) drop */
108
109extern red_t		*red_alloc(int, int, int, int, int, int);
110extern void		 red_destroy(red_t *);
111extern void		 red_getstats(red_t *, struct redstats *);
112extern int		 red_addq(red_t *, class_queue_t *, struct mbuf *,
113			     struct altq_pktattr *);
114extern struct mbuf	*red_getq(red_t *, class_queue_t *);
115extern int		 drop_early(int, int, int);
116extern int		 mark_ecn(struct mbuf *, struct altq_pktattr *, int);
117extern struct wtab	*wtab_alloc(int);
118extern int		 wtab_destroy(struct wtab *);
119extern int32_t		 pow_w(struct wtab *, int);
120
121#endif /* _KERNEL */
122
123#endif /* _ALTQ_ALTQ_RED_H_ */