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