1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart# 2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart# Copyright (c) 2011 Thomas Graf <tgraf@suug.ch> 3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart# 4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"""VLAN network link 6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart""" 8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartfrom __future__ import absolute_import 10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartfrom ... import core as netlink 13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartfrom .. import capi as capi 14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartclass VLANLink(object): 15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def __init__(self, link): 16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart self._link = link 17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart @property 19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart @netlink.nlattr(type=int) 20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def id(self): 21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart """vlan identifier""" 22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return capi.rtnl_link_vlan_get_id(self._link) 23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart @id.setter 25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def id(self, value): 26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart capi.rtnl_link_vlan_set_id(self._link, int(value)) 27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart @property 29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart @netlink.nlattr(type=str) 30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def flags(self): 31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart """ VLAN flags 32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart Setting this property will *Not* reset flags to value you supply in 33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart Examples: 34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart link.flags = '+xxx' # add xxx flag 35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart link.flags = 'xxx' # exactly the same 36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart link.flags = '-xxx' # remove xxx flag 37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart link.flags = [ '+xxx', '-yyy' ] # list operation 38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart """ 39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart flags = capi.rtnl_link_vlan_get_flags(self._link) 40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return capi.rtnl_link_vlan_flags2str(flags, 256)[0].split(',') 41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def _set_flag(self, flag): 43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if flag.startswith('-'): 44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart i = capi.rtnl_link_vlan_str2flags(flag[1:]) 45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart capi.rtnl_link_vlan_unset_flags(self._link, i) 46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart elif flag.startswith('+'): 47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart i = capi.rtnl_link_vlan_str2flags(flag[1:]) 48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart capi.rtnl_link_vlan_set_flags(self._link, i) 49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart else: 50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart i = capi.rtnl_link_vlan_str2flags(flag) 51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart capi.rtnl_link_vlan_set_flags(self._link, i) 52054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 53054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart @flags.setter 54054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def flags(self, value): 55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if type(value) is list: 56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart for flag in value: 57054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart self._set_flag(flag) 58054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart else: 59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart self._set_flag(value) 60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 61054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ################################################################### 62054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart # TODO: 63054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart # - ingress map 64054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart # - egress map 65054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 66054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def brief(self): 67054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return 'vlan-id {0}'.format(self.id) 68054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartdef init(link): 70054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart link.vlan = VLANLink(link._rtnl_link) 71054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return link.vlan 72