summaryrefslogtreecommitdiff
path: root/python/netlink/route/links/vlan.py
blob: 8bee3c91c15f6feee50d13846f108dfa493bb59d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#
# Copyright (c) 2011 Thomas Graf <tgraf@suug.ch>
#

"""VLAN network link

"""

from __future__ import absolute_import


from ... import core as netlink
from .. import capi as capi


class VLANLink(object):
    def __init__(self, link):
        self._link = link

    @property
    @netlink.nlattr(type=int)
    def id(self):
        """vlan identifier"""
        return capi.rtnl_link_vlan_get_id(self._link)

    @id.setter
    def id(self, value):
        capi.rtnl_link_vlan_set_id(self._link, int(value))

    @property
    @netlink.nlattr(type=str)
    def flags(self):
        """VLAN flags
        Setting this property will *Not* reset flags to value you supply in
        Examples:
        link.flags = '+xxx' # add xxx flag
        link.flags = 'xxx'  # exactly the same
        link.flags = '-xxx' # remove xxx flag
        link.flags = [ '+xxx', '-yyy' ] # list operation
        """
        flags = capi.rtnl_link_vlan_get_flags(self._link)
        return capi.rtnl_link_vlan_flags2str(flags, 256)[0].split(",")

    def _set_flag(self, flag):
        if flag.startswith("-"):
            i = capi.rtnl_link_vlan_str2flags(flag[1:])
            capi.rtnl_link_vlan_unset_flags(self._link, i)
        elif flag.startswith("+"):
            i = capi.rtnl_link_vlan_str2flags(flag[1:])
            capi.rtnl_link_vlan_set_flags(self._link, i)
        else:
            i = capi.rtnl_link_vlan_str2flags(flag)
            capi.rtnl_link_vlan_set_flags(self._link, i)

    @flags.setter
    def flags(self, value):
        if type(value) is list:
            for flag in value:
                self._set_flag(flag)
        else:
            self._set_flag(value)

    ###################################################################
    # TODO:
    #   - ingress map
    #   - egress map

    def brief(self):
        return "vlan-id {0}".format(self.id)


def init(link):
    link.vlan = VLANLink(link._rtnl_link)
    return link.vlan