xref: /aosp_15_r20/external/libnl/python/netlink/route/links/bridge.py (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker#
2*4dc78e53SAndroid Build Coastguard Worker# Copyright (c) 2013 Nicolas PLANEL <[email protected]>
3*4dc78e53SAndroid Build Coastguard Worker#
4*4dc78e53SAndroid Build Coastguard Worker
5*4dc78e53SAndroid Build Coastguard Worker"""BRIDGE network link
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 Workerfrom __future__ import print_function
11*4dc78e53SAndroid Build Coastguard Worker
12*4dc78e53SAndroid Build Coastguard Workerfrom ... import core as netlink
13*4dc78e53SAndroid Build Coastguard Workerfrom .. import capi as capi
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Workerclass BRIDGELink(object):
17*4dc78e53SAndroid Build Coastguard Worker    def __init__(self, link):
18*4dc78e53SAndroid Build Coastguard Worker        self._link = link
19*4dc78e53SAndroid Build Coastguard Worker        self._has_ext_info = capi.rtnl_link_bridge_has_ext_info(self._link)
20*4dc78e53SAndroid Build Coastguard Worker        self._port_state_values = [
21*4dc78e53SAndroid Build Coastguard Worker            "disabled",
22*4dc78e53SAndroid Build Coastguard Worker            "listening",
23*4dc78e53SAndroid Build Coastguard Worker            "learning",
24*4dc78e53SAndroid Build Coastguard Worker            "forwarding",
25*4dc78e53SAndroid Build Coastguard Worker            "blocking",
26*4dc78e53SAndroid Build Coastguard Worker        ]
27*4dc78e53SAndroid Build Coastguard Worker
28*4dc78e53SAndroid Build Coastguard Worker    def bridge_assert_ext_info(self):
29*4dc78e53SAndroid Build Coastguard Worker        if not self._has_ext_info:
30*4dc78e53SAndroid Build Coastguard Worker            print(
31*4dc78e53SAndroid Build Coastguard Worker                """
32*4dc78e53SAndroid Build Coastguard Worker            Please update your kernel to be able to call this method.
33*4dc78e53SAndroid Build Coastguard Worker            Your current kernel bridge version is too old to support this extention.
34*4dc78e53SAndroid Build Coastguard Worker            """
35*4dc78e53SAndroid Build Coastguard Worker            )
36*4dc78e53SAndroid Build Coastguard Worker            raise RuntimeWarning()
37*4dc78e53SAndroid Build Coastguard Worker
38*4dc78e53SAndroid Build Coastguard Worker    def port_state2str(self, state):
39*4dc78e53SAndroid Build Coastguard Worker        return self._port_state_values[state]
40*4dc78e53SAndroid Build Coastguard Worker
41*4dc78e53SAndroid Build Coastguard Worker    def str2port_state(self, str):
42*4dc78e53SAndroid Build Coastguard Worker        for value, port in enumerate(self._port_state_values):
43*4dc78e53SAndroid Build Coastguard Worker            if str.lower() == port:
44*4dc78e53SAndroid Build Coastguard Worker                return value
45*4dc78e53SAndroid Build Coastguard Worker        raise ValueError()
46*4dc78e53SAndroid Build Coastguard Worker
47*4dc78e53SAndroid Build Coastguard Worker    @property
48*4dc78e53SAndroid Build Coastguard Worker    @netlink.nlattr(type=int)
49*4dc78e53SAndroid Build Coastguard Worker    def port_state(self):
50*4dc78e53SAndroid Build Coastguard Worker        """bridge state :
51*4dc78e53SAndroid Build Coastguard Worker        %s
52*4dc78e53SAndroid Build Coastguard Worker        """ % (
53*4dc78e53SAndroid Build Coastguard Worker            self.port_state
54*4dc78e53SAndroid Build Coastguard Worker        )
55*4dc78e53SAndroid Build Coastguard Worker        return capi.rtnl_link_bridge_get_state(self._link)
56*4dc78e53SAndroid Build Coastguard Worker
57*4dc78e53SAndroid Build Coastguard Worker    @port_state.setter
58*4dc78e53SAndroid Build Coastguard Worker    def port_state(self, state):
59*4dc78e53SAndroid Build Coastguard Worker        capi.rtnl_link_bridge_set_state(self._link, int(state))
60*4dc78e53SAndroid Build Coastguard Worker
61*4dc78e53SAndroid Build Coastguard Worker    @property
62*4dc78e53SAndroid Build Coastguard Worker    @netlink.nlattr(type=int)
63*4dc78e53SAndroid Build Coastguard Worker    def priority(self):
64*4dc78e53SAndroid Build Coastguard Worker        """bridge prio"""
65*4dc78e53SAndroid Build Coastguard Worker        self.bridge_assert_ext_info()
66*4dc78e53SAndroid Build Coastguard Worker        return capi.rtnl_link_bridge_get_prio(self._link)
67*4dc78e53SAndroid Build Coastguard Worker
68*4dc78e53SAndroid Build Coastguard Worker    @priority.setter
69*4dc78e53SAndroid Build Coastguard Worker    def priority(self, prio):
70*4dc78e53SAndroid Build Coastguard Worker        self.bridge_assert_ext_info()
71*4dc78e53SAndroid Build Coastguard Worker        if prio < 0 or prio >= 2**16:
72*4dc78e53SAndroid Build Coastguard Worker            raise ValueError()
73*4dc78e53SAndroid Build Coastguard Worker        capi.rtnl_link_bridge_set_prio(self._link, int(prio))
74*4dc78e53SAndroid Build Coastguard Worker
75*4dc78e53SAndroid Build Coastguard Worker    @property
76*4dc78e53SAndroid Build Coastguard Worker    @netlink.nlattr(type=int)
77*4dc78e53SAndroid Build Coastguard Worker    def cost(self):
78*4dc78e53SAndroid Build Coastguard Worker        """bridge prio"""
79*4dc78e53SAndroid Build Coastguard Worker        self.bridge_assert_ext_info()
80*4dc78e53SAndroid Build Coastguard Worker        return capi.rtnl_link_bridge_get_cost(self._link)
81*4dc78e53SAndroid Build Coastguard Worker
82*4dc78e53SAndroid Build Coastguard Worker    @cost.setter
83*4dc78e53SAndroid Build Coastguard Worker    def cost(self, cost):
84*4dc78e53SAndroid Build Coastguard Worker        self.bridge_assert_ext_info()
85*4dc78e53SAndroid Build Coastguard Worker        if cost < 0 or cost >= 2**32:
86*4dc78e53SAndroid Build Coastguard Worker            raise ValueError()
87*4dc78e53SAndroid Build Coastguard Worker        capi.rtnl_link_bridge_set_cost(self._link, int(cost))
88*4dc78e53SAndroid Build Coastguard Worker
89*4dc78e53SAndroid Build Coastguard Worker    @property
90*4dc78e53SAndroid Build Coastguard Worker    @netlink.nlattr(type=str)
91*4dc78e53SAndroid Build Coastguard Worker    def flags(self):
92*4dc78e53SAndroid Build Coastguard Worker        """BRIDGE flags
93*4dc78e53SAndroid Build Coastguard Worker        Setting this property will *Not* reset flags to value you supply in
94*4dc78e53SAndroid Build Coastguard Worker        Examples:
95*4dc78e53SAndroid Build Coastguard Worker        link.flags = '+xxx' # add xxx flag
96*4dc78e53SAndroid Build Coastguard Worker        link.flags = 'xxx'  # exactly the same
97*4dc78e53SAndroid Build Coastguard Worker        link.flags = '-xxx' # remove xxx flag
98*4dc78e53SAndroid Build Coastguard Worker        link.flags = [ '+xxx', '-yyy' ] # list operation
99*4dc78e53SAndroid Build Coastguard Worker        """
100*4dc78e53SAndroid Build Coastguard Worker        self.bridge_assert_ext_info()
101*4dc78e53SAndroid Build Coastguard Worker        flags = capi.rtnl_link_bridge_get_flags(self._link)
102*4dc78e53SAndroid Build Coastguard Worker        return capi.rtnl_link_bridge_flags2str(flags, 256)[0].split(",")
103*4dc78e53SAndroid Build Coastguard Worker
104*4dc78e53SAndroid Build Coastguard Worker    def _set_flag(self, flag):
105*4dc78e53SAndroid Build Coastguard Worker        if flag.startswith("-"):
106*4dc78e53SAndroid Build Coastguard Worker            i = capi.rtnl_link_bridge_str2flags(flag[1:])
107*4dc78e53SAndroid Build Coastguard Worker            capi.rtnl_link_bridge_unset_flags(self._link, i)
108*4dc78e53SAndroid Build Coastguard Worker        elif flag.startswith("+"):
109*4dc78e53SAndroid Build Coastguard Worker            i = capi.rtnl_link_bridge_str2flags(flag[1:])
110*4dc78e53SAndroid Build Coastguard Worker            capi.rtnl_link_bridge_set_flags(self._link, i)
111*4dc78e53SAndroid Build Coastguard Worker        else:
112*4dc78e53SAndroid Build Coastguard Worker            i = capi.rtnl_link_bridge_str2flags(flag)
113*4dc78e53SAndroid Build Coastguard Worker            capi.rtnl_link_bridge_set_flags(self._link, i)
114*4dc78e53SAndroid Build Coastguard Worker
115*4dc78e53SAndroid Build Coastguard Worker    @flags.setter
116*4dc78e53SAndroid Build Coastguard Worker    def flags(self, value):
117*4dc78e53SAndroid Build Coastguard Worker        self.bridge_assert_ext_info()
118*4dc78e53SAndroid Build Coastguard Worker        if type(value) is list:
119*4dc78e53SAndroid Build Coastguard Worker            for flag in value:
120*4dc78e53SAndroid Build Coastguard Worker                self._set_flag(flag)
121*4dc78e53SAndroid Build Coastguard Worker        else:
122*4dc78e53SAndroid Build Coastguard Worker            self._set_flag(value)
123*4dc78e53SAndroid Build Coastguard Worker
124*4dc78e53SAndroid Build Coastguard Worker    def brief(self):
125*4dc78e53SAndroid Build Coastguard Worker        return "bridge-has-ext-info {0}".format(self._has_ext_info)
126*4dc78e53SAndroid Build Coastguard Worker
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Workerdef init(link):
129*4dc78e53SAndroid Build Coastguard Worker    link.bridge = BRIDGELink(link._rtnl_link)
130*4dc78e53SAndroid Build Coastguard Worker    return link.bridge
131