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