1*4dc78e53SAndroid Build Coastguard Worker# 2*4dc78e53SAndroid Build Coastguard Worker# Copyright (c) 2011 Thomas Graf <[email protected]> 3*4dc78e53SAndroid Build Coastguard Worker# 4*4dc78e53SAndroid Build Coastguard Worker 5*4dc78e53SAndroid Build Coastguard Worker"""HTB qdisc 6*4dc78e53SAndroid Build Coastguard Worker 7*4dc78e53SAndroid Build Coastguard Worker""" 8*4dc78e53SAndroid Build Coastguard Worker 9*4dc78e53SAndroid Build Coastguard Workerfrom __future__ import absolute_import 10*4dc78e53SAndroid Build Coastguard Worker 11*4dc78e53SAndroid Build Coastguard Workerfrom ... import core as netlink 12*4dc78e53SAndroid Build Coastguard Workerfrom ... import util as util 13*4dc78e53SAndroid Build Coastguard Workerfrom .. import capi as capi 14*4dc78e53SAndroid Build Coastguard Workerfrom .. import tc as tc 15*4dc78e53SAndroid Build Coastguard Worker 16*4dc78e53SAndroid Build Coastguard Worker 17*4dc78e53SAndroid Build Coastguard Workerclass HTBQdisc(object): 18*4dc78e53SAndroid Build Coastguard Worker def __init__(self, qdisc): 19*4dc78e53SAndroid Build Coastguard Worker self._qdisc = qdisc 20*4dc78e53SAndroid Build Coastguard Worker 21*4dc78e53SAndroid Build Coastguard Worker @property 22*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=int) 23*4dc78e53SAndroid Build Coastguard Worker def default_class(self): 24*4dc78e53SAndroid Build Coastguard Worker return tc.Handle(capi.rtnl_htb_get_defcls(self._qdisc._rtnl_qdisc)) 25*4dc78e53SAndroid Build Coastguard Worker 26*4dc78e53SAndroid Build Coastguard Worker @default_class.setter 27*4dc78e53SAndroid Build Coastguard Worker def default_class(self, value): 28*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_defcls(self._qdisc._rtnl_qdisc, int(value)) 29*4dc78e53SAndroid Build Coastguard Worker 30*4dc78e53SAndroid Build Coastguard Worker @property 31*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=int) 32*4dc78e53SAndroid Build Coastguard Worker def r2q(self): 33*4dc78e53SAndroid Build Coastguard Worker return capi.rtnl_htb_get_rate2quantum(self._qdisc._rtnl_qdisc) 34*4dc78e53SAndroid Build Coastguard Worker 35*4dc78e53SAndroid Build Coastguard Worker @r2q.setter 36*4dc78e53SAndroid Build Coastguard Worker def r2q(self, value): 37*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_get_rate2quantum(self._qdisc._rtnl_qdisc, int(value)) 38*4dc78e53SAndroid Build Coastguard Worker 39*4dc78e53SAndroid Build Coastguard Worker def brief(self): 40*4dc78e53SAndroid Build Coastguard Worker fmt = util.MyFormatter(self) 41*4dc78e53SAndroid Build Coastguard Worker 42*4dc78e53SAndroid Build Coastguard Worker ret = " {s|default-class!k} {a|default_class}" 43*4dc78e53SAndroid Build Coastguard Worker 44*4dc78e53SAndroid Build Coastguard Worker if self.r2q: 45*4dc78e53SAndroid Build Coastguard Worker ret += " {s|r2q!k} {a|r2q}" 46*4dc78e53SAndroid Build Coastguard Worker 47*4dc78e53SAndroid Build Coastguard Worker return fmt.format(ret) 48*4dc78e53SAndroid Build Coastguard Worker 49*4dc78e53SAndroid Build Coastguard Worker 50*4dc78e53SAndroid Build Coastguard Workerclass HTBClass(object): 51*4dc78e53SAndroid Build Coastguard Worker def __init__(self, cl): 52*4dc78e53SAndroid Build Coastguard Worker self._class = cl 53*4dc78e53SAndroid Build Coastguard Worker 54*4dc78e53SAndroid Build Coastguard Worker @property 55*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=str) 56*4dc78e53SAndroid Build Coastguard Worker def rate(self): 57*4dc78e53SAndroid Build Coastguard Worker rate = capi.rtnl_htb_get_rate(self._class._rtnl_class) 58*4dc78e53SAndroid Build Coastguard Worker return util.Rate(rate) 59*4dc78e53SAndroid Build Coastguard Worker 60*4dc78e53SAndroid Build Coastguard Worker @rate.setter 61*4dc78e53SAndroid Build Coastguard Worker def rate(self, value): 62*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_rate(self._class._rtnl_class, int(value)) 63*4dc78e53SAndroid Build Coastguard Worker 64*4dc78e53SAndroid Build Coastguard Worker @property 65*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=str) 66*4dc78e53SAndroid Build Coastguard Worker def ceil(self): 67*4dc78e53SAndroid Build Coastguard Worker ceil = capi.rtnl_htb_get_ceil(self._class._rtnl_class) 68*4dc78e53SAndroid Build Coastguard Worker return util.Rate(ceil) 69*4dc78e53SAndroid Build Coastguard Worker 70*4dc78e53SAndroid Build Coastguard Worker @ceil.setter 71*4dc78e53SAndroid Build Coastguard Worker def ceil(self, value): 72*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_ceil(self._class._rtnl_class, int(value)) 73*4dc78e53SAndroid Build Coastguard Worker 74*4dc78e53SAndroid Build Coastguard Worker @property 75*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=str) 76*4dc78e53SAndroid Build Coastguard Worker def burst(self): 77*4dc78e53SAndroid Build Coastguard Worker burst = capi.rtnl_htb_get_rbuffer(self._class._rtnl_class) 78*4dc78e53SAndroid Build Coastguard Worker return util.Size(burst) 79*4dc78e53SAndroid Build Coastguard Worker 80*4dc78e53SAndroid Build Coastguard Worker @burst.setter 81*4dc78e53SAndroid Build Coastguard Worker def burst(self, value): 82*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_rbuffer(self._class._rtnl_class, int(value)) 83*4dc78e53SAndroid Build Coastguard Worker 84*4dc78e53SAndroid Build Coastguard Worker @property 85*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=str) 86*4dc78e53SAndroid Build Coastguard Worker def ceil_burst(self): 87*4dc78e53SAndroid Build Coastguard Worker burst = capi.rtnl_htb_get_cbuffer(self._class._rtnl_class) 88*4dc78e53SAndroid Build Coastguard Worker return util.Size(burst) 89*4dc78e53SAndroid Build Coastguard Worker 90*4dc78e53SAndroid Build Coastguard Worker @ceil_burst.setter 91*4dc78e53SAndroid Build Coastguard Worker def ceil_burst(self, value): 92*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_cbuffer(self._class._rtnl_class, int(value)) 93*4dc78e53SAndroid Build Coastguard Worker 94*4dc78e53SAndroid Build Coastguard Worker @property 95*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=int) 96*4dc78e53SAndroid Build Coastguard Worker def prio(self): 97*4dc78e53SAndroid Build Coastguard Worker return capi.rtnl_htb_get_prio(self._class._rtnl_class) 98*4dc78e53SAndroid Build Coastguard Worker 99*4dc78e53SAndroid Build Coastguard Worker @prio.setter 100*4dc78e53SAndroid Build Coastguard Worker def prio(self, value): 101*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_prio(self._class._rtnl_class, int(value)) 102*4dc78e53SAndroid Build Coastguard Worker 103*4dc78e53SAndroid Build Coastguard Worker @property 104*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=int) 105*4dc78e53SAndroid Build Coastguard Worker def quantum(self): 106*4dc78e53SAndroid Build Coastguard Worker return capi.rtnl_htb_get_quantum(self._class._rtnl_class) 107*4dc78e53SAndroid Build Coastguard Worker 108*4dc78e53SAndroid Build Coastguard Worker @quantum.setter 109*4dc78e53SAndroid Build Coastguard Worker def quantum(self, value): 110*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_quantum(self._class._rtnl_class, int(value)) 111*4dc78e53SAndroid Build Coastguard Worker 112*4dc78e53SAndroid Build Coastguard Worker @property 113*4dc78e53SAndroid Build Coastguard Worker @netlink.nlattr(type=int) 114*4dc78e53SAndroid Build Coastguard Worker def level(self): 115*4dc78e53SAndroid Build Coastguard Worker return capi.rtnl_htb_get_level(self._class._rtnl_class) 116*4dc78e53SAndroid Build Coastguard Worker 117*4dc78e53SAndroid Build Coastguard Worker @level.setter 118*4dc78e53SAndroid Build Coastguard Worker def level(self, value): 119*4dc78e53SAndroid Build Coastguard Worker capi.rtnl_htb_set_level(self._class._rtnl_class, int(value)) 120*4dc78e53SAndroid Build Coastguard Worker 121*4dc78e53SAndroid Build Coastguard Worker def brief(self): 122*4dc78e53SAndroid Build Coastguard Worker fmt = util.MyFormatter(self) 123*4dc78e53SAndroid Build Coastguard Worker 124*4dc78e53SAndroid Build Coastguard Worker ret = " {t|prio} {t|rate}" 125*4dc78e53SAndroid Build Coastguard Worker 126*4dc78e53SAndroid Build Coastguard Worker if self.rate != self.ceil: 127*4dc78e53SAndroid Build Coastguard Worker ret += " {s|borrow-up-to!k} {a|ceil}" 128*4dc78e53SAndroid Build Coastguard Worker 129*4dc78e53SAndroid Build Coastguard Worker ret += " {t|burst}" 130*4dc78e53SAndroid Build Coastguard Worker 131*4dc78e53SAndroid Build Coastguard Worker return fmt.format(ret) 132*4dc78e53SAndroid Build Coastguard Worker 133*4dc78e53SAndroid Build Coastguard Worker def details(self): 134*4dc78e53SAndroid Build Coastguard Worker fmt = util.MyFormatter(self) 135*4dc78e53SAndroid Build Coastguard Worker 136*4dc78e53SAndroid Build Coastguard Worker return fmt.nl("\t{t|level} {t|quantum}") 137*4dc78e53SAndroid Build Coastguard Worker 138*4dc78e53SAndroid Build Coastguard Worker 139*4dc78e53SAndroid Build Coastguard Workerdef init_qdisc(qdisc): 140*4dc78e53SAndroid Build Coastguard Worker qdisc.htb = HTBQdisc(qdisc) 141*4dc78e53SAndroid Build Coastguard Worker return qdisc.htb 142*4dc78e53SAndroid Build Coastguard Worker 143*4dc78e53SAndroid Build Coastguard Worker 144*4dc78e53SAndroid Build Coastguard Workerdef init_class(cl): 145*4dc78e53SAndroid Build Coastguard Worker cl.htb = HTBClass(cl) 146*4dc78e53SAndroid Build Coastguard Worker return cl.htb 147*4dc78e53SAndroid Build Coastguard Worker 148*4dc78e53SAndroid Build Coastguard Worker 149*4dc78e53SAndroid Build Coastguard Worker# extern void rtnl_htb_set_quantum(struct rtnl_class *, uint32_t quantum); 150