1# 2# Copyright (c) 2011 Thomas Graf <[email protected]> 3# 4 5"""VLAN network link 6 7""" 8 9from __future__ import absolute_import 10 11 12from ... import core as netlink 13from .. import capi as capi 14 15 16class VLANLink(object): 17 def __init__(self, link): 18 self._link = link 19 20 @property 21 @netlink.nlattr(type=int) 22 def id(self): 23 """vlan identifier""" 24 return capi.rtnl_link_vlan_get_id(self._link) 25 26 @id.setter 27 def id(self, value): 28 capi.rtnl_link_vlan_set_id(self._link, int(value)) 29 30 @property 31 @netlink.nlattr(type=str) 32 def flags(self): 33 """VLAN flags 34 Setting this property will *Not* reset flags to value you supply in 35 Examples: 36 link.flags = '+xxx' # add xxx flag 37 link.flags = 'xxx' # exactly the same 38 link.flags = '-xxx' # remove xxx flag 39 link.flags = [ '+xxx', '-yyy' ] # list operation 40 """ 41 flags = capi.rtnl_link_vlan_get_flags(self._link) 42 return capi.rtnl_link_vlan_flags2str(flags, 256)[0].split(",") 43 44 def _set_flag(self, flag): 45 if flag.startswith("-"): 46 i = capi.rtnl_link_vlan_str2flags(flag[1:]) 47 capi.rtnl_link_vlan_unset_flags(self._link, i) 48 elif flag.startswith("+"): 49 i = capi.rtnl_link_vlan_str2flags(flag[1:]) 50 capi.rtnl_link_vlan_set_flags(self._link, i) 51 else: 52 i = capi.rtnl_link_vlan_str2flags(flag) 53 capi.rtnl_link_vlan_set_flags(self._link, i) 54 55 @flags.setter 56 def flags(self, value): 57 if type(value) is list: 58 for flag in value: 59 self._set_flag(flag) 60 else: 61 self._set_flag(value) 62 63 ################################################################### 64 # TODO: 65 # - ingress map 66 # - egress map 67 68 def brief(self): 69 return "vlan-id {0}".format(self.id) 70 71 72def init(link): 73 link.vlan = VLANLink(link._rtnl_link) 74 return link.vlan 75