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