Annotation of sys/altq/altq_cdnr.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: altq_cdnr.h,v 1.4 2002/12/16 17:27:20 henning Exp $ */
! 2: /* $KAME: altq_cdnr.h,v 1.6 2000/12/14 08:12:45 thorpej Exp $ */
! 3:
! 4: /*
! 5: * Copyright (C) 1999-2000
! 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: #ifndef _ALTQ_ALTQ_CDNR_H_
! 31: #define _ALTQ_ALTQ_CDNR_H_
! 32:
! 33: #include <altq/altq.h>
! 34:
! 35: /*
! 36: * traffic conditioner element types
! 37: */
! 38: #define TCETYPE_NONE 0
! 39: #define TCETYPE_TOP 1 /* top level conditioner */
! 40: #define TCETYPE_ELEMENT 2 /* a simple tc element */
! 41: #define TCETYPE_TBMETER 3 /* token bucket meter */
! 42: #define TCETYPE_TRTCM 4 /* (two-rate) three color marker */
! 43: #define TCETYPE_TSWTCM 5 /* time sliding window 3-color maker */
! 44:
! 45: /*
! 46: * traffic conditioner action
! 47: */
! 48: struct cdnr_block;
! 49:
! 50: struct tc_action {
! 51: int tca_code; /* e.g., TCACODE_PASS */
! 52: /* tca_code dependent variable */
! 53: union {
! 54: u_long un_value; /* template */
! 55: u_int8_t un_dscp; /* diffserv code point */
! 56: u_long un_handle; /* tc action handle */
! 57: struct cdnr_block *un_next; /* next tc element block */
! 58: } tca_un;
! 59: };
! 60: #define tca_value tca_un.un_value
! 61: #define tca_dscp tca_un.un_dscp
! 62: #define tca_handle tca_un.un_handle
! 63: #define tca_next tca_un.un_next
! 64:
! 65: #define TCACODE_NONE 0 /* action is not set */
! 66: #define TCACODE_PASS 1 /* pass this packet */
! 67: #define TCACODE_DROP 2 /* discard this packet */
! 68: #define TCACODE_RETURN 3 /* do not process this packet */
! 69: #define TCACODE_MARK 4 /* mark dscp */
! 70: #define TCACODE_HANDLE 5 /* take action specified by handle */
! 71: #define TCACODE_NEXT 6 /* take action in the next tc element */
! 72: #define TCACODE_MAX 6
! 73:
! 74: #define CDNR_NULL_HANDLE 0
! 75:
! 76: struct cdnr_interface {
! 77: char cdnr_ifname[IFNAMSIZ]; /* interface name (e.g., fxp0) */
! 78: };
! 79:
! 80: /* simple element operations */
! 81: struct cdnr_add_element {
! 82: struct cdnr_interface iface;
! 83: struct tc_action action;
! 84:
! 85: u_long cdnr_handle; /* return value */
! 86: };
! 87:
! 88: struct cdnr_delete_element {
! 89: struct cdnr_interface iface;
! 90: u_long cdnr_handle;
! 91: };
! 92:
! 93: /* token-bucket meter operations */
! 94: struct cdnr_add_tbmeter {
! 95: struct cdnr_interface iface;
! 96: struct tb_profile profile;
! 97: struct tc_action in_action;
! 98: struct tc_action out_action;
! 99:
! 100: u_long cdnr_handle; /* return value */
! 101: };
! 102:
! 103: struct cdnr_modify_tbmeter {
! 104: struct cdnr_interface iface;
! 105: u_long cdnr_handle;
! 106: struct tb_profile profile;
! 107: };
! 108:
! 109: struct cdnr_tbmeter_stats {
! 110: struct cdnr_interface iface;
! 111: u_long cdnr_handle;
! 112: struct pktcntr in_cnt;
! 113: struct pktcntr out_cnt;
! 114: };
! 115:
! 116: /* two-rate three-color marker operations */
! 117: struct cdnr_add_trtcm {
! 118: struct cdnr_interface iface;
! 119: struct tb_profile cmtd_profile; /* profile for committed tb */
! 120: struct tb_profile peak_profile; /* profile for peak tb */
! 121: struct tc_action green_action; /* action for green packets */
! 122: struct tc_action yellow_action; /* action for yellow packets */
! 123: struct tc_action red_action; /* action for red packets */
! 124: int coloraware; /* color-aware/color-blind */
! 125:
! 126: u_long cdnr_handle; /* return value */
! 127: };
! 128:
! 129: struct cdnr_modify_trtcm {
! 130: struct cdnr_interface iface;
! 131: u_long cdnr_handle;
! 132: struct tb_profile cmtd_profile; /* profile for committed tb */
! 133: struct tb_profile peak_profile; /* profile for peak tb */
! 134: int coloraware; /* color-aware/color-blind */
! 135: };
! 136:
! 137: struct cdnr_tcm_stats {
! 138: struct cdnr_interface iface;
! 139: u_long cdnr_handle;
! 140: struct pktcntr green_cnt;
! 141: struct pktcntr yellow_cnt;
! 142: struct pktcntr red_cnt;
! 143: };
! 144:
! 145: /* time sliding window three-color marker operations */
! 146: struct cdnr_add_tswtcm {
! 147: struct cdnr_interface iface;
! 148: u_int32_t cmtd_rate; /* committed rate (bits/sec) */
! 149: u_int32_t peak_rate; /* peak rate (bits/sec) */
! 150: u_int32_t avg_interval; /* averaging interval (msec) */
! 151: struct tc_action green_action; /* action for green packets */
! 152: struct tc_action yellow_action; /* action for yellow packets */
! 153: struct tc_action red_action; /* action for red packets */
! 154:
! 155: u_long cdnr_handle; /* return value */
! 156: };
! 157:
! 158: struct cdnr_modify_tswtcm {
! 159: struct cdnr_interface iface;
! 160: u_long cdnr_handle;
! 161: u_int32_t cmtd_rate; /* committed rate (bits/sec) */
! 162: u_int32_t peak_rate; /* peak rate (bits/sec) */
! 163: u_int32_t avg_interval; /* averaging interval (msec) */
! 164: };
! 165:
! 166: struct tce_stats {
! 167: u_long tce_handle; /* tc element handle */
! 168: int tce_type; /* e.g., TCETYPE_ELEMENT */
! 169: struct pktcntr tce_cnts[3]; /* tcm returns 3 counters */
! 170: };
! 171:
! 172: struct cdnr_get_stats {
! 173: struct cdnr_interface iface;
! 174: struct pktcntr cnts[TCACODE_MAX+1];
! 175:
! 176: /* element stats */
! 177: int nskip; /* skip # of elements */
! 178: int nelements; /* # of element stats (WR) */
! 179: struct tce_stats *tce_stats; /* pointer to stats array */
! 180: };
! 181:
! 182: #ifndef DSCP_EF
! 183: /* diffserve code points */
! 184: #define DSCP_MASK 0xfc
! 185: #define DSCP_CUMASK 0x03
! 186: #define DSCP_EF 0xb8
! 187: #define DSCP_AF11 0x28
! 188: #define DSCP_AF12 0x30
! 189: #define DSCP_AF13 0x38
! 190: #define DSCP_AF21 0x48
! 191: #define DSCP_AF22 0x50
! 192: #define DSCP_AF23 0x58
! 193: #define DSCP_AF31 0x68
! 194: #define DSCP_AF32 0x70
! 195: #define DSCP_AF33 0x78
! 196: #define DSCP_AF41 0x88
! 197: #define DSCP_AF42 0x90
! 198: #define DSCP_AF43 0x98
! 199: #define AF_CLASSMASK 0xe0
! 200: #define AF_DROPPRECMASK 0x18
! 201: #endif
! 202:
! 203: #ifdef _KERNEL
! 204:
! 205: /*
! 206: * packet information passed to the input function of tc elements
! 207: */
! 208: struct cdnr_pktinfo {
! 209: int pkt_len; /* packet length */
! 210: u_int8_t pkt_dscp; /* diffserv code point */
! 211: };
! 212:
! 213: /*
! 214: * traffic conditioner control block common to all types of tc elements
! 215: */
! 216: struct cdnr_block {
! 217: LIST_ENTRY(cdnr_block) cb_next;
! 218: int cb_len; /* size of this tc element */
! 219: int cb_type; /* cdnr block type */
! 220: int cb_ref; /* reference count of this element */
! 221: u_long cb_handle; /* handle of this tc element */
! 222: struct top_cdnr *cb_top; /* back pointer to top */
! 223: struct tc_action cb_action; /* top level action for this tcb */
! 224: struct tc_action *(*cb_input)(struct cdnr_block *,
! 225: struct cdnr_pktinfo *);
! 226: };
! 227:
! 228: /*
! 229: * top level traffic conditioner structure for an interface
! 230: */
! 231: struct top_cdnr {
! 232: struct cdnr_block tc_block;
! 233:
! 234: LIST_ENTRY(top_cdnr) tc_next;
! 235: struct ifaltq *tc_ifq;
! 236:
! 237: LIST_HEAD(, cdnr_block) tc_elements;
! 238:
! 239: struct pktcntr tc_cnts[TCACODE_MAX+1];
! 240: };
! 241:
! 242: /* token bucket element */
! 243: struct tbe {
! 244: u_int64_t rate;
! 245: u_int64_t depth;
! 246:
! 247: u_int64_t token;
! 248: u_int64_t filluptime;
! 249: u_int64_t last;
! 250: };
! 251:
! 252: /* token bucket meter structure */
! 253: struct tbmeter {
! 254: struct cdnr_block cdnrblk; /* conditioner block */
! 255: struct tbe tb; /* token bucket */
! 256: struct tc_action in_action; /* actions for IN/OUT */
! 257: struct tc_action out_action; /* actions for IN/OUT */
! 258: struct pktcntr in_cnt; /* statistics for IN/OUT */
! 259: struct pktcntr out_cnt; /* statistics for IN/OUT */
! 260: };
! 261:
! 262: /* two-rate three-color marker structure */
! 263: struct trtcm {
! 264: struct cdnr_block cdnrblk; /* conditioner block */
! 265: struct tbe cmtd_tb; /* committed tb profile */
! 266: struct tbe peak_tb; /* peak tb profile */
! 267: struct tc_action green_action;
! 268: struct tc_action yellow_action;
! 269: struct tc_action red_action;
! 270: int coloraware;
! 271: u_int8_t green_dscp;
! 272: u_int8_t yellow_dscp;
! 273: u_int8_t red_dscp;
! 274: struct pktcntr green_cnt;
! 275: struct pktcntr yellow_cnt;
! 276: struct pktcntr red_cnt;
! 277: };
! 278:
! 279: /* time sliding window three-color marker structure */
! 280: struct tswtcm {
! 281: struct cdnr_block cdnrblk; /* conditioner block */
! 282:
! 283: u_int32_t avg_rate; /* average rate (bytes/sec) */
! 284: u_int64_t t_front; /* timestamp of last update */
! 285:
! 286: u_int64_t timewin; /* average interval */
! 287: u_int32_t cmtd_rate; /* committed target rate */
! 288: u_int32_t peak_rate; /* peak target rate */
! 289: struct tc_action green_action;
! 290: struct tc_action yellow_action;
! 291: struct tc_action red_action;
! 292: u_int8_t green_dscp;
! 293: u_int8_t yellow_dscp;
! 294: u_int8_t red_dscp;
! 295: struct pktcntr green_cnt;
! 296: struct pktcntr yellow_cnt;
! 297: struct pktcntr red_cnt;
! 298: };
! 299:
! 300: #endif /* _KERNEL */
! 301:
! 302: #endif /* _ALTQ_ALTQ_CDNR_H_ */
CVSweb