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