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