summaryrefslogtreecommitdiff
path: root/python/netlink/route/links/bridge.py
blob: 09d9334cb65031f043f335411157a478a65539c7 (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
#
# Copyright (c) 2013 Nicolas PLANEL <nicolas.planel@enovance.com>
#

"""BRIDGE network link

"""

from __future__ import absolute_import

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 self._has_ext_info == False:
            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
        """
        bridge_assert_ext_info()
        return capi.rtnl_link_bridge_get_prio(self._link)

    @priority.setter
    def priority(self, prio):
        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
        """
        bridge_assert_ext_info()
        return capi.rtnl_link_bridge_get_cost(self._link)

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

    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