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