vlan.py 1.9 KB

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