summaryrefslogtreecommitdiff
path: root/python/netlink/route/links/bridge.py
blob: d3e72e533e27538ea7476a892711758393ba8a79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#
# Copyright (c) 2013 Nicolas PLANEL <nicolas.planel@enovance.com>
#

"""BRIDGE network link

"""

from __future__ import absolute_import
from __future__ import print_function

from ... import core as netlink
from .. import capi as capi


class BRIDGELink(object):
    def __init__(self, link):
        self._link = link
        self._has_ext_info = capi.rtnl_link_bridge_has_ext_info(self._link)
        self._port_state_values = [
            "disabled",
            "listening",
            "learning",
            "forwarding",
            "blocking",
        ]

    def bridge_assert_ext_info(self):
        if not self._has_ext_info:
            print(
                """
            Please update your kernel to be able to call this method.
            Your current kernel bridge version is too old to support this extention.
            """
            )
            raise RuntimeWarning()

    def port_state2str(self, state):
        return self._port_state_values[state]

    def str2port_state(self, str):
        for value, port in enumerate(self._port_state_values):
            if str.lower() == port:
                return value
        raise ValueError()

    @property
    @netlink.nlattr(type=int)
    def port_state(self):
        """bridge state :
        %s
        """ % (
            self.port_state
        )
        return capi.rtnl_link_bridge_get_state(self._link)

    @port_state.setter
    def port_state(self, state):
        capi.rtnl_link_bridge_set_state(self._link, int(state))

    @property
    @netlink.nlattr(type=int)
    def priority(self):
        """bridge prio"""
        self.bridge_assert_ext_info()
        return capi.rtnl_link_bridge_get_prio(self._link)

    @priority.setter
    def priority(self, prio):
        self.bridge_assert_ext_info()
        if prio < 0 or prio >= 2**16:
            raise ValueError()
        capi.rtnl_link_bridge_set_prio(self._link, int(prio))

    @property
    @netlink.nlattr(type=int)
    def cost(self):
        """bridge prio"""
        self.bridge_assert_ext_info()
        return capi.rtnl_link_bridge_get_cost(self._link)

    @cost.setter
    def cost(self, cost):
        self.bridge_assert_ext_info()
        if cost < 0 or cost >= 2**32:
            raise ValueError()
        capi.rtnl_link_bridge_set_cost(self._link, int(cost))

    @property
    @netlink.nlattr(type=str)
    def flags(self):
        """BRIDGE flags
        Setting this property will *Not* reset flags to value you supply in
        Examples:
        link.flags = '+xxx' # add xxx flag
        link.flags = 'xxx'  # exactly the same
        link.flags = '-xxx' # remove xxx flag
        link.flags = [ '+xxx', '-yyy' ] # list operation
        """
        self.bridge_assert_ext_info()
        flags = capi.rtnl_link_bridge_get_flags(self._link)
        return capi.rtnl_link_bridge_flags2str(flags, 256)[0].split(",")

    def _set_flag(self, flag):
        if flag.startswith("-"):
            i = capi.rtnl_link_bridge_str2flags(flag[1:])
            capi.rtnl_link_bridge_unset_flags(self._link, i)
        elif flag.startswith("+"):
            i = capi.rtnl_link_bridge_str2flags(flag[1:])
            capi.rtnl_link_bridge_set_flags(self._link, i)
        else:
            i = capi.rtnl_link_bridge_str2flags(flag)
            capi.rtnl_link_bridge_set_flags(self._link, i)

    @flags.setter
    def flags(self, value):
        self.bridge_assert_ext_info()
        if type(value) is list:
            for flag in value:
                self._set_flag(flag)
        else:
            self._set_flag(value)

    def brief(self):
        return "bridge-has-ext-info {0}".format(self._has_ext_info)


def init(link):
    link.bridge = BRIDGELink(link._rtnl_link)
    return link.bridge