root/altq/altq_cdnr.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    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_ */

/* [<][>][^][v][top][bottom][index][help] */