[BACK]Return to altq_cdnr.h CVS log [TXT][DIR] Up to [local] / sys / altq

Annotation of sys/altq/altq_cdnr.h, Revision 1.1.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