1*53ee8cc1Swenshuai.xi #ifndef __LINUX_PKT_SCHED_H 2*53ee8cc1Swenshuai.xi #define __LINUX_PKT_SCHED_H 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi /* Logical priority bands not depending on specific packet scheduler. 5*53ee8cc1Swenshuai.xi Every scheduler will map them to real traffic classes, if it has 6*53ee8cc1Swenshuai.xi no more precise mechanism to classify packets. 7*53ee8cc1Swenshuai.xi 8*53ee8cc1Swenshuai.xi These numbers have no special meaning, though their coincidence 9*53ee8cc1Swenshuai.xi with obsolete IPv6 values is not occasional :-). New IPv6 drafts 10*53ee8cc1Swenshuai.xi preferred full anarchy inspired by diffserv group. 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xi Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy 13*53ee8cc1Swenshuai.xi class, actually, as rule it will be handled with more care than 14*53ee8cc1Swenshuai.xi filler or even bulk. 15*53ee8cc1Swenshuai.xi */ 16*53ee8cc1Swenshuai.xi 17*53ee8cc1Swenshuai.xi #define TC_PRIO_BESTEFFORT 0 18*53ee8cc1Swenshuai.xi #define TC_PRIO_FILLER 1 19*53ee8cc1Swenshuai.xi #define TC_PRIO_BULK 2 20*53ee8cc1Swenshuai.xi #define TC_PRIO_INTERACTIVE_BULK 4 21*53ee8cc1Swenshuai.xi #define TC_PRIO_INTERACTIVE 6 22*53ee8cc1Swenshuai.xi #define TC_PRIO_CONTROL 7 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xi #define TC_PRIO_MAX 15 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xi /* Generic queue statistics, available for all the elements. 27*53ee8cc1Swenshuai.xi Particular schedulers may have also their private records. 28*53ee8cc1Swenshuai.xi */ 29*53ee8cc1Swenshuai.xi 30*53ee8cc1Swenshuai.xi struct tc_stats 31*53ee8cc1Swenshuai.xi { 32*53ee8cc1Swenshuai.xi __u64 bytes; /* NUmber of enqueues bytes */ 33*53ee8cc1Swenshuai.xi __u32 packets; /* Number of enqueued packets */ 34*53ee8cc1Swenshuai.xi __u32 drops; /* Packets dropped because of lack of resources */ 35*53ee8cc1Swenshuai.xi __u32 overlimits; /* Number of throttle events when this 36*53ee8cc1Swenshuai.xi * flow goes out of allocated bandwidth */ 37*53ee8cc1Swenshuai.xi __u32 bps; /* Current flow byte rate */ 38*53ee8cc1Swenshuai.xi __u32 pps; /* Current flow packet rate */ 39*53ee8cc1Swenshuai.xi __u32 qlen; 40*53ee8cc1Swenshuai.xi __u32 backlog; 41*53ee8cc1Swenshuai.xi }; 42*53ee8cc1Swenshuai.xi 43*53ee8cc1Swenshuai.xi struct tc_estimator 44*53ee8cc1Swenshuai.xi { 45*53ee8cc1Swenshuai.xi signed char interval; 46*53ee8cc1Swenshuai.xi unsigned char ewma_log; 47*53ee8cc1Swenshuai.xi }; 48*53ee8cc1Swenshuai.xi 49*53ee8cc1Swenshuai.xi /* "Handles" 50*53ee8cc1Swenshuai.xi --------- 51*53ee8cc1Swenshuai.xi 52*53ee8cc1Swenshuai.xi All the traffic control objects have 32bit identifiers, or "handles". 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi They can be considered as opaque numbers from user API viewpoint, 55*53ee8cc1Swenshuai.xi but actually they always consist of two fields: major and 56*53ee8cc1Swenshuai.xi minor numbers, which are interpreted by kernel specially, 57*53ee8cc1Swenshuai.xi that may be used by applications, though not recommended. 58*53ee8cc1Swenshuai.xi 59*53ee8cc1Swenshuai.xi F.e. qdisc handles always have minor number equal to zero, 60*53ee8cc1Swenshuai.xi classes (or flows) have major equal to parent qdisc major, and 61*53ee8cc1Swenshuai.xi minor uniquely identifying class inside qdisc. 62*53ee8cc1Swenshuai.xi 63*53ee8cc1Swenshuai.xi Macros to manipulate handles: 64*53ee8cc1Swenshuai.xi */ 65*53ee8cc1Swenshuai.xi 66*53ee8cc1Swenshuai.xi #define TC_H_MAJ_MASK (0xFFFF0000U) 67*53ee8cc1Swenshuai.xi #define TC_H_MIN_MASK (0x0000FFFFU) 68*53ee8cc1Swenshuai.xi #define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) 69*53ee8cc1Swenshuai.xi #define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) 70*53ee8cc1Swenshuai.xi #define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) 71*53ee8cc1Swenshuai.xi 72*53ee8cc1Swenshuai.xi #define TC_H_UNSPEC (0U) 73*53ee8cc1Swenshuai.xi #define TC_H_ROOT (0xFFFFFFFFU) 74*53ee8cc1Swenshuai.xi #define TC_H_INGRESS (0xFFFFFFF1U) 75*53ee8cc1Swenshuai.xi 76*53ee8cc1Swenshuai.xi struct tc_ratespec 77*53ee8cc1Swenshuai.xi { 78*53ee8cc1Swenshuai.xi unsigned char cell_log; 79*53ee8cc1Swenshuai.xi unsigned char __reserved; 80*53ee8cc1Swenshuai.xi unsigned short overhead; 81*53ee8cc1Swenshuai.xi short cell_align; 82*53ee8cc1Swenshuai.xi unsigned short mpu; 83*53ee8cc1Swenshuai.xi __u32 rate; 84*53ee8cc1Swenshuai.xi }; 85*53ee8cc1Swenshuai.xi 86*53ee8cc1Swenshuai.xi #define TC_RTAB_SIZE 1024 87*53ee8cc1Swenshuai.xi 88*53ee8cc1Swenshuai.xi /* FIFO section */ 89*53ee8cc1Swenshuai.xi 90*53ee8cc1Swenshuai.xi struct tc_fifo_qopt 91*53ee8cc1Swenshuai.xi { 92*53ee8cc1Swenshuai.xi __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ 93*53ee8cc1Swenshuai.xi }; 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xi /* PRIO section */ 96*53ee8cc1Swenshuai.xi 97*53ee8cc1Swenshuai.xi #define TCQ_PRIO_BANDS 16 98*53ee8cc1Swenshuai.xi #define TCQ_MIN_PRIO_BANDS 2 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi struct tc_prio_qopt 101*53ee8cc1Swenshuai.xi { 102*53ee8cc1Swenshuai.xi int bands; /* Number of bands */ 103*53ee8cc1Swenshuai.xi __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ 104*53ee8cc1Swenshuai.xi }; 105*53ee8cc1Swenshuai.xi 106*53ee8cc1Swenshuai.xi enum 107*53ee8cc1Swenshuai.xi { 108*53ee8cc1Swenshuai.xi TCA_PRIO_UNSPEC, 109*53ee8cc1Swenshuai.xi TCA_PRIO_MQ, 110*53ee8cc1Swenshuai.xi __TCA_PRIO_MAX 111*53ee8cc1Swenshuai.xi }; 112*53ee8cc1Swenshuai.xi 113*53ee8cc1Swenshuai.xi #define TCA_PRIO_MAX (__TCA_PRIO_MAX - 1) 114*53ee8cc1Swenshuai.xi 115*53ee8cc1Swenshuai.xi /* TBF section */ 116*53ee8cc1Swenshuai.xi 117*53ee8cc1Swenshuai.xi struct tc_tbf_qopt 118*53ee8cc1Swenshuai.xi { 119*53ee8cc1Swenshuai.xi struct tc_ratespec rate; 120*53ee8cc1Swenshuai.xi struct tc_ratespec peakrate; 121*53ee8cc1Swenshuai.xi __u32 limit; 122*53ee8cc1Swenshuai.xi __u32 buffer; 123*53ee8cc1Swenshuai.xi __u32 mtu; 124*53ee8cc1Swenshuai.xi }; 125*53ee8cc1Swenshuai.xi 126*53ee8cc1Swenshuai.xi enum 127*53ee8cc1Swenshuai.xi { 128*53ee8cc1Swenshuai.xi TCA_TBF_UNSPEC, 129*53ee8cc1Swenshuai.xi TCA_TBF_PARMS, 130*53ee8cc1Swenshuai.xi TCA_TBF_RTAB, 131*53ee8cc1Swenshuai.xi TCA_TBF_PTAB, 132*53ee8cc1Swenshuai.xi __TCA_TBF_MAX, 133*53ee8cc1Swenshuai.xi }; 134*53ee8cc1Swenshuai.xi 135*53ee8cc1Swenshuai.xi #define TCA_TBF_MAX (__TCA_TBF_MAX - 1) 136*53ee8cc1Swenshuai.xi 137*53ee8cc1Swenshuai.xi 138*53ee8cc1Swenshuai.xi /* TEQL section */ 139*53ee8cc1Swenshuai.xi 140*53ee8cc1Swenshuai.xi /* TEQL does not require any parameters */ 141*53ee8cc1Swenshuai.xi 142*53ee8cc1Swenshuai.xi /* SFQ section */ 143*53ee8cc1Swenshuai.xi 144*53ee8cc1Swenshuai.xi struct tc_sfq_qopt 145*53ee8cc1Swenshuai.xi { 146*53ee8cc1Swenshuai.xi unsigned quantum; /* Bytes per round allocated to flow */ 147*53ee8cc1Swenshuai.xi int perturb_period; /* Period of hash perturbation */ 148*53ee8cc1Swenshuai.xi __u32 limit; /* Maximal packets in queue */ 149*53ee8cc1Swenshuai.xi unsigned divisor; /* Hash divisor */ 150*53ee8cc1Swenshuai.xi unsigned flows; /* Maximal number of flows */ 151*53ee8cc1Swenshuai.xi }; 152*53ee8cc1Swenshuai.xi 153*53ee8cc1Swenshuai.xi struct tc_sfq_xstats 154*53ee8cc1Swenshuai.xi { 155*53ee8cc1Swenshuai.xi __s32 allot; 156*53ee8cc1Swenshuai.xi }; 157*53ee8cc1Swenshuai.xi 158*53ee8cc1Swenshuai.xi /* 159*53ee8cc1Swenshuai.xi * NOTE: limit, divisor and flows are hardwired to code at the moment. 160*53ee8cc1Swenshuai.xi * 161*53ee8cc1Swenshuai.xi * limit=flows=128, divisor=1024; 162*53ee8cc1Swenshuai.xi * 163*53ee8cc1Swenshuai.xi * The only reason for this is efficiency, it is possible 164*53ee8cc1Swenshuai.xi * to change these parameters in compile time. 165*53ee8cc1Swenshuai.xi */ 166*53ee8cc1Swenshuai.xi 167*53ee8cc1Swenshuai.xi /* RED section */ 168*53ee8cc1Swenshuai.xi 169*53ee8cc1Swenshuai.xi enum 170*53ee8cc1Swenshuai.xi { 171*53ee8cc1Swenshuai.xi TCA_RED_UNSPEC, 172*53ee8cc1Swenshuai.xi TCA_RED_PARMS, 173*53ee8cc1Swenshuai.xi TCA_RED_STAB, 174*53ee8cc1Swenshuai.xi __TCA_RED_MAX, 175*53ee8cc1Swenshuai.xi }; 176*53ee8cc1Swenshuai.xi 177*53ee8cc1Swenshuai.xi #define TCA_RED_MAX (__TCA_RED_MAX - 1) 178*53ee8cc1Swenshuai.xi 179*53ee8cc1Swenshuai.xi struct tc_red_qopt 180*53ee8cc1Swenshuai.xi { 181*53ee8cc1Swenshuai.xi __u32 limit; /* HARD maximal queue length (bytes) */ 182*53ee8cc1Swenshuai.xi __u32 qth_min; /* Min average length threshold (bytes) */ 183*53ee8cc1Swenshuai.xi __u32 qth_max; /* Max average length threshold (bytes) */ 184*53ee8cc1Swenshuai.xi unsigned char Wlog; /* log(W) */ 185*53ee8cc1Swenshuai.xi unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ 186*53ee8cc1Swenshuai.xi unsigned char Scell_log; /* cell size for idle damping */ 187*53ee8cc1Swenshuai.xi unsigned char flags; 188*53ee8cc1Swenshuai.xi #define TC_RED_ECN 1 189*53ee8cc1Swenshuai.xi #define TC_RED_HARDDROP 2 190*53ee8cc1Swenshuai.xi }; 191*53ee8cc1Swenshuai.xi 192*53ee8cc1Swenshuai.xi struct tc_red_xstats 193*53ee8cc1Swenshuai.xi { 194*53ee8cc1Swenshuai.xi __u32 early; /* Early drops */ 195*53ee8cc1Swenshuai.xi __u32 pdrop; /* Drops due to queue limits */ 196*53ee8cc1Swenshuai.xi __u32 other; /* Drops due to drop() calls */ 197*53ee8cc1Swenshuai.xi __u32 marked; /* Marked packets */ 198*53ee8cc1Swenshuai.xi }; 199*53ee8cc1Swenshuai.xi 200*53ee8cc1Swenshuai.xi /* GRED section */ 201*53ee8cc1Swenshuai.xi 202*53ee8cc1Swenshuai.xi #define MAX_DPs 16 203*53ee8cc1Swenshuai.xi 204*53ee8cc1Swenshuai.xi enum 205*53ee8cc1Swenshuai.xi { 206*53ee8cc1Swenshuai.xi TCA_GRED_UNSPEC, 207*53ee8cc1Swenshuai.xi TCA_GRED_PARMS, 208*53ee8cc1Swenshuai.xi TCA_GRED_STAB, 209*53ee8cc1Swenshuai.xi TCA_GRED_DPS, 210*53ee8cc1Swenshuai.xi __TCA_GRED_MAX, 211*53ee8cc1Swenshuai.xi }; 212*53ee8cc1Swenshuai.xi 213*53ee8cc1Swenshuai.xi #define TCA_GRED_MAX (__TCA_GRED_MAX - 1) 214*53ee8cc1Swenshuai.xi 215*53ee8cc1Swenshuai.xi struct tc_gred_qopt 216*53ee8cc1Swenshuai.xi { 217*53ee8cc1Swenshuai.xi __u32 limit; /* HARD maximal queue length (bytes) */ 218*53ee8cc1Swenshuai.xi __u32 qth_min; /* Min average length threshold (bytes) */ 219*53ee8cc1Swenshuai.xi __u32 qth_max; /* Max average length threshold (bytes) */ 220*53ee8cc1Swenshuai.xi __u32 DP; /* upto 2^32 DPs */ 221*53ee8cc1Swenshuai.xi __u32 backlog; 222*53ee8cc1Swenshuai.xi __u32 qave; 223*53ee8cc1Swenshuai.xi __u32 forced; 224*53ee8cc1Swenshuai.xi __u32 early; 225*53ee8cc1Swenshuai.xi __u32 other; 226*53ee8cc1Swenshuai.xi __u32 pdrop; 227*53ee8cc1Swenshuai.xi __u8 Wlog; /* log(W) */ 228*53ee8cc1Swenshuai.xi __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ 229*53ee8cc1Swenshuai.xi __u8 Scell_log; /* cell size for idle damping */ 230*53ee8cc1Swenshuai.xi __u8 prio; /* prio of this VQ */ 231*53ee8cc1Swenshuai.xi __u32 packets; 232*53ee8cc1Swenshuai.xi __u32 bytesin; 233*53ee8cc1Swenshuai.xi }; 234*53ee8cc1Swenshuai.xi 235*53ee8cc1Swenshuai.xi /* gred setup */ 236*53ee8cc1Swenshuai.xi struct tc_gred_sopt 237*53ee8cc1Swenshuai.xi { 238*53ee8cc1Swenshuai.xi __u32 DPs; 239*53ee8cc1Swenshuai.xi __u32 def_DP; 240*53ee8cc1Swenshuai.xi __u8 grio; 241*53ee8cc1Swenshuai.xi __u8 flags; 242*53ee8cc1Swenshuai.xi __u16 pad1; 243*53ee8cc1Swenshuai.xi }; 244*53ee8cc1Swenshuai.xi 245*53ee8cc1Swenshuai.xi /* HTB section */ 246*53ee8cc1Swenshuai.xi #define TC_HTB_NUMPRIO 8 247*53ee8cc1Swenshuai.xi #define TC_HTB_MAXDEPTH 8 248*53ee8cc1Swenshuai.xi #define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ 249*53ee8cc1Swenshuai.xi 250*53ee8cc1Swenshuai.xi struct tc_htb_opt 251*53ee8cc1Swenshuai.xi { 252*53ee8cc1Swenshuai.xi struct tc_ratespec rate; 253*53ee8cc1Swenshuai.xi struct tc_ratespec ceil; 254*53ee8cc1Swenshuai.xi __u32 buffer; 255*53ee8cc1Swenshuai.xi __u32 cbuffer; 256*53ee8cc1Swenshuai.xi __u32 quantum; 257*53ee8cc1Swenshuai.xi __u32 level; /* out only */ 258*53ee8cc1Swenshuai.xi __u32 prio; 259*53ee8cc1Swenshuai.xi }; 260*53ee8cc1Swenshuai.xi struct tc_htb_glob 261*53ee8cc1Swenshuai.xi { 262*53ee8cc1Swenshuai.xi __u32 version; /* to match HTB/TC */ 263*53ee8cc1Swenshuai.xi __u32 rate2quantum; /* bps->quantum divisor */ 264*53ee8cc1Swenshuai.xi __u32 defcls; /* default class number */ 265*53ee8cc1Swenshuai.xi __u32 debug; /* debug flags */ 266*53ee8cc1Swenshuai.xi 267*53ee8cc1Swenshuai.xi /* stats */ 268*53ee8cc1Swenshuai.xi __u32 direct_pkts; /* count of non shapped packets */ 269*53ee8cc1Swenshuai.xi }; 270*53ee8cc1Swenshuai.xi enum 271*53ee8cc1Swenshuai.xi { 272*53ee8cc1Swenshuai.xi TCA_HTB_UNSPEC, 273*53ee8cc1Swenshuai.xi TCA_HTB_PARMS, 274*53ee8cc1Swenshuai.xi TCA_HTB_INIT, 275*53ee8cc1Swenshuai.xi TCA_HTB_CTAB, 276*53ee8cc1Swenshuai.xi TCA_HTB_RTAB, 277*53ee8cc1Swenshuai.xi __TCA_HTB_MAX, 278*53ee8cc1Swenshuai.xi }; 279*53ee8cc1Swenshuai.xi 280*53ee8cc1Swenshuai.xi #define TCA_HTB_MAX (__TCA_HTB_MAX - 1) 281*53ee8cc1Swenshuai.xi 282*53ee8cc1Swenshuai.xi struct tc_htb_xstats 283*53ee8cc1Swenshuai.xi { 284*53ee8cc1Swenshuai.xi __u32 lends; 285*53ee8cc1Swenshuai.xi __u32 borrows; 286*53ee8cc1Swenshuai.xi __u32 giants; /* too big packets (rate will not be accurate) */ 287*53ee8cc1Swenshuai.xi __u32 tokens; 288*53ee8cc1Swenshuai.xi __u32 ctokens; 289*53ee8cc1Swenshuai.xi }; 290*53ee8cc1Swenshuai.xi 291*53ee8cc1Swenshuai.xi /* HFSC section */ 292*53ee8cc1Swenshuai.xi 293*53ee8cc1Swenshuai.xi struct tc_hfsc_qopt 294*53ee8cc1Swenshuai.xi { 295*53ee8cc1Swenshuai.xi __u16 defcls; /* default class */ 296*53ee8cc1Swenshuai.xi }; 297*53ee8cc1Swenshuai.xi 298*53ee8cc1Swenshuai.xi struct tc_service_curve 299*53ee8cc1Swenshuai.xi { 300*53ee8cc1Swenshuai.xi __u32 m1; /* slope of the first segment in bps */ 301*53ee8cc1Swenshuai.xi __u32 d; /* x-projection of the first segment in us */ 302*53ee8cc1Swenshuai.xi __u32 m2; /* slope of the second segment in bps */ 303*53ee8cc1Swenshuai.xi }; 304*53ee8cc1Swenshuai.xi 305*53ee8cc1Swenshuai.xi struct tc_hfsc_stats 306*53ee8cc1Swenshuai.xi { 307*53ee8cc1Swenshuai.xi __u64 work; /* total work done */ 308*53ee8cc1Swenshuai.xi __u64 rtwork; /* work done by real-time criteria */ 309*53ee8cc1Swenshuai.xi __u32 period; /* current period */ 310*53ee8cc1Swenshuai.xi __u32 level; /* class level in hierarchy */ 311*53ee8cc1Swenshuai.xi }; 312*53ee8cc1Swenshuai.xi 313*53ee8cc1Swenshuai.xi enum 314*53ee8cc1Swenshuai.xi { 315*53ee8cc1Swenshuai.xi TCA_HFSC_UNSPEC, 316*53ee8cc1Swenshuai.xi TCA_HFSC_RSC, 317*53ee8cc1Swenshuai.xi TCA_HFSC_FSC, 318*53ee8cc1Swenshuai.xi TCA_HFSC_USC, 319*53ee8cc1Swenshuai.xi __TCA_HFSC_MAX, 320*53ee8cc1Swenshuai.xi }; 321*53ee8cc1Swenshuai.xi 322*53ee8cc1Swenshuai.xi #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) 323*53ee8cc1Swenshuai.xi 324*53ee8cc1Swenshuai.xi 325*53ee8cc1Swenshuai.xi /* CBQ section */ 326*53ee8cc1Swenshuai.xi 327*53ee8cc1Swenshuai.xi #define TC_CBQ_MAXPRIO 8 328*53ee8cc1Swenshuai.xi #define TC_CBQ_MAXLEVEL 8 329*53ee8cc1Swenshuai.xi #define TC_CBQ_DEF_EWMA 5 330*53ee8cc1Swenshuai.xi 331*53ee8cc1Swenshuai.xi struct tc_cbq_lssopt 332*53ee8cc1Swenshuai.xi { 333*53ee8cc1Swenshuai.xi unsigned char change; 334*53ee8cc1Swenshuai.xi unsigned char flags; 335*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_BOUNDED 1 336*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_ISOLATED 2 337*53ee8cc1Swenshuai.xi unsigned char ewma_log; 338*53ee8cc1Swenshuai.xi unsigned char level; 339*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_FLAGS 1 340*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_EWMA 2 341*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_MAXIDLE 4 342*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_MINIDLE 8 343*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_OFFTIME 0x10 344*53ee8cc1Swenshuai.xi #define TCF_CBQ_LSS_AVPKT 0x20 345*53ee8cc1Swenshuai.xi __u32 maxidle; 346*53ee8cc1Swenshuai.xi __u32 minidle; 347*53ee8cc1Swenshuai.xi __u32 offtime; 348*53ee8cc1Swenshuai.xi __u32 avpkt; 349*53ee8cc1Swenshuai.xi }; 350*53ee8cc1Swenshuai.xi 351*53ee8cc1Swenshuai.xi struct tc_cbq_wrropt 352*53ee8cc1Swenshuai.xi { 353*53ee8cc1Swenshuai.xi unsigned char flags; 354*53ee8cc1Swenshuai.xi unsigned char priority; 355*53ee8cc1Swenshuai.xi unsigned char cpriority; 356*53ee8cc1Swenshuai.xi unsigned char __reserved; 357*53ee8cc1Swenshuai.xi __u32 allot; 358*53ee8cc1Swenshuai.xi __u32 weight; 359*53ee8cc1Swenshuai.xi }; 360*53ee8cc1Swenshuai.xi 361*53ee8cc1Swenshuai.xi struct tc_cbq_ovl 362*53ee8cc1Swenshuai.xi { 363*53ee8cc1Swenshuai.xi unsigned char strategy; 364*53ee8cc1Swenshuai.xi #define TC_CBQ_OVL_CLASSIC 0 365*53ee8cc1Swenshuai.xi #define TC_CBQ_OVL_DELAY 1 366*53ee8cc1Swenshuai.xi #define TC_CBQ_OVL_LOWPRIO 2 367*53ee8cc1Swenshuai.xi #define TC_CBQ_OVL_DROP 3 368*53ee8cc1Swenshuai.xi #define TC_CBQ_OVL_RCLASSIC 4 369*53ee8cc1Swenshuai.xi unsigned char priority2; 370*53ee8cc1Swenshuai.xi __u16 pad; 371*53ee8cc1Swenshuai.xi __u32 penalty; 372*53ee8cc1Swenshuai.xi }; 373*53ee8cc1Swenshuai.xi 374*53ee8cc1Swenshuai.xi struct tc_cbq_police 375*53ee8cc1Swenshuai.xi { 376*53ee8cc1Swenshuai.xi unsigned char police; 377*53ee8cc1Swenshuai.xi unsigned char __res1; 378*53ee8cc1Swenshuai.xi unsigned short __res2; 379*53ee8cc1Swenshuai.xi }; 380*53ee8cc1Swenshuai.xi 381*53ee8cc1Swenshuai.xi struct tc_cbq_fopt 382*53ee8cc1Swenshuai.xi { 383*53ee8cc1Swenshuai.xi __u32 split; 384*53ee8cc1Swenshuai.xi __u32 defmap; 385*53ee8cc1Swenshuai.xi __u32 defchange; 386*53ee8cc1Swenshuai.xi }; 387*53ee8cc1Swenshuai.xi 388*53ee8cc1Swenshuai.xi struct tc_cbq_xstats 389*53ee8cc1Swenshuai.xi { 390*53ee8cc1Swenshuai.xi __u32 borrows; 391*53ee8cc1Swenshuai.xi __u32 overactions; 392*53ee8cc1Swenshuai.xi __s32 avgidle; 393*53ee8cc1Swenshuai.xi __s32 undertime; 394*53ee8cc1Swenshuai.xi }; 395*53ee8cc1Swenshuai.xi 396*53ee8cc1Swenshuai.xi enum 397*53ee8cc1Swenshuai.xi { 398*53ee8cc1Swenshuai.xi TCA_CBQ_UNSPEC, 399*53ee8cc1Swenshuai.xi TCA_CBQ_LSSOPT, 400*53ee8cc1Swenshuai.xi TCA_CBQ_WRROPT, 401*53ee8cc1Swenshuai.xi TCA_CBQ_FOPT, 402*53ee8cc1Swenshuai.xi TCA_CBQ_OVL_STRATEGY, 403*53ee8cc1Swenshuai.xi TCA_CBQ_RATE, 404*53ee8cc1Swenshuai.xi TCA_CBQ_RTAB, 405*53ee8cc1Swenshuai.xi TCA_CBQ_POLICE, 406*53ee8cc1Swenshuai.xi __TCA_CBQ_MAX, 407*53ee8cc1Swenshuai.xi }; 408*53ee8cc1Swenshuai.xi 409*53ee8cc1Swenshuai.xi #define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) 410*53ee8cc1Swenshuai.xi 411*53ee8cc1Swenshuai.xi /* dsmark section */ 412*53ee8cc1Swenshuai.xi 413*53ee8cc1Swenshuai.xi enum { 414*53ee8cc1Swenshuai.xi TCA_DSMARK_UNSPEC, 415*53ee8cc1Swenshuai.xi TCA_DSMARK_INDICES, 416*53ee8cc1Swenshuai.xi TCA_DSMARK_DEFAULT_INDEX, 417*53ee8cc1Swenshuai.xi TCA_DSMARK_SET_TC_INDEX, 418*53ee8cc1Swenshuai.xi TCA_DSMARK_MASK, 419*53ee8cc1Swenshuai.xi TCA_DSMARK_VALUE, 420*53ee8cc1Swenshuai.xi __TCA_DSMARK_MAX, 421*53ee8cc1Swenshuai.xi }; 422*53ee8cc1Swenshuai.xi 423*53ee8cc1Swenshuai.xi #define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) 424*53ee8cc1Swenshuai.xi 425*53ee8cc1Swenshuai.xi /* ATM section */ 426*53ee8cc1Swenshuai.xi 427*53ee8cc1Swenshuai.xi enum { 428*53ee8cc1Swenshuai.xi TCA_ATM_UNSPEC, 429*53ee8cc1Swenshuai.xi TCA_ATM_FD, /* file/socket descriptor */ 430*53ee8cc1Swenshuai.xi TCA_ATM_PTR, /* pointer to descriptor - later */ 431*53ee8cc1Swenshuai.xi TCA_ATM_HDR, /* LL header */ 432*53ee8cc1Swenshuai.xi TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ 433*53ee8cc1Swenshuai.xi TCA_ATM_ADDR, /* PVC address (for output only) */ 434*53ee8cc1Swenshuai.xi TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ 435*53ee8cc1Swenshuai.xi __TCA_ATM_MAX, 436*53ee8cc1Swenshuai.xi }; 437*53ee8cc1Swenshuai.xi 438*53ee8cc1Swenshuai.xi #define TCA_ATM_MAX (__TCA_ATM_MAX - 1) 439*53ee8cc1Swenshuai.xi 440*53ee8cc1Swenshuai.xi /* Network emulator */ 441*53ee8cc1Swenshuai.xi 442*53ee8cc1Swenshuai.xi enum 443*53ee8cc1Swenshuai.xi { 444*53ee8cc1Swenshuai.xi TCA_NETEM_UNSPEC, 445*53ee8cc1Swenshuai.xi TCA_NETEM_CORR, 446*53ee8cc1Swenshuai.xi TCA_NETEM_DELAY_DIST, 447*53ee8cc1Swenshuai.xi TCA_NETEM_REORDER, 448*53ee8cc1Swenshuai.xi TCA_NETEM_CORRUPT, 449*53ee8cc1Swenshuai.xi __TCA_NETEM_MAX, 450*53ee8cc1Swenshuai.xi }; 451*53ee8cc1Swenshuai.xi 452*53ee8cc1Swenshuai.xi #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) 453*53ee8cc1Swenshuai.xi 454*53ee8cc1Swenshuai.xi struct tc_netem_qopt 455*53ee8cc1Swenshuai.xi { 456*53ee8cc1Swenshuai.xi __u32 latency; /* added delay (us) */ 457*53ee8cc1Swenshuai.xi __u32 limit; /* fifo limit (packets) */ 458*53ee8cc1Swenshuai.xi __u32 loss; /* random packet loss (0=none ~0=100%) */ 459*53ee8cc1Swenshuai.xi __u32 gap; /* re-ordering gap (0 for none) */ 460*53ee8cc1Swenshuai.xi __u32 duplicate; /* random packet dup (0=none ~0=100%) */ 461*53ee8cc1Swenshuai.xi __u32 jitter; /* random jitter in latency (us) */ 462*53ee8cc1Swenshuai.xi }; 463*53ee8cc1Swenshuai.xi 464*53ee8cc1Swenshuai.xi struct tc_netem_corr 465*53ee8cc1Swenshuai.xi { 466*53ee8cc1Swenshuai.xi __u32 delay_corr; /* delay correlation */ 467*53ee8cc1Swenshuai.xi __u32 loss_corr; /* packet loss correlation */ 468*53ee8cc1Swenshuai.xi __u32 dup_corr; /* duplicate correlation */ 469*53ee8cc1Swenshuai.xi }; 470*53ee8cc1Swenshuai.xi 471*53ee8cc1Swenshuai.xi struct tc_netem_reorder 472*53ee8cc1Swenshuai.xi { 473*53ee8cc1Swenshuai.xi __u32 probability; 474*53ee8cc1Swenshuai.xi __u32 correlation; 475*53ee8cc1Swenshuai.xi }; 476*53ee8cc1Swenshuai.xi 477*53ee8cc1Swenshuai.xi struct tc_netem_corrupt 478*53ee8cc1Swenshuai.xi { 479*53ee8cc1Swenshuai.xi __u32 probability; 480*53ee8cc1Swenshuai.xi __u32 correlation; 481*53ee8cc1Swenshuai.xi }; 482*53ee8cc1Swenshuai.xi 483*53ee8cc1Swenshuai.xi #define NETEM_DIST_SCALE 8192 484*53ee8cc1Swenshuai.xi 485*53ee8cc1Swenshuai.xi #endif 486