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