]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
python: add bridge flags API
authorNicolas PLANEL <nicolas.planel@enovance.com>
Fri, 11 Oct 2013 15:52:22 +0000 (15:52 +0000)
committerThomas Graf <tgraf@suug.ch>
Tue, 22 Oct 2013 12:20:41 +0000 (14:20 +0200)
Add flags set/get methods aim to change bridge flags :
 o hairpin_mode
 o bpdu_guard
 o root_block
 o fast_leave

Signed-off-by: Nicolas PLANEL <nicolas.planel@enovance.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
include/netlink/route/link/bridge.h
lib/route/link/bridge.c
python/netlink/route/capi.i
python/netlink/route/links/bridge.py

index 71dcc24bb2ede09563b6a0ea941ae06742b8743d..74d0e6218b8e8e5dc6f2b64e84cad4538b7cd3e9 100644 (file)
@@ -48,6 +48,9 @@ extern int    rtnl_link_bridge_unset_flags(struct rtnl_link *, unsigned int);
 extern int     rtnl_link_bridge_set_flags(struct rtnl_link *, unsigned int);
 extern int     rtnl_link_bridge_get_flags(struct rtnl_link *);
 
+extern char * rtnl_link_bridge_flags2str(int, char *, size_t);
+extern int     rtnl_link_bridge_str2flags(const char *);
+
 #ifdef __cplusplus
 }
 #endif
index eb02b22c5f6aed77a87b0ae342c825b1246adcc6..fcf3272b96d2f6de31fbfdbf23b016bd89b31bd9 100644 (file)
@@ -451,6 +451,30 @@ int rtnl_link_bridge_get_flags(struct rtnl_link *link)
        return bd->b_flags;
 }
 
+static const struct trans_tbl bridge_flags[] = {
+       __ADD(RTNL_BRIDGE_HAIRPIN_MODE, hairpin_mode)
+       __ADD(RTNL_BRIDGE_BPDU_GUARD,   bpdu_guard)
+       __ADD(RTNL_BRIDGE_ROOT_BLOCK,   root_block)
+       __ADD(RTNL_BRIDGE_FAST_LEAVE,   fast_leave)
+};
+
+/**
+ * @name Flag Translation
+ * @{
+ */
+
+char *rtnl_link_bridge_flags2str(int flags, char *buf, size_t len)
+{
+       return __flags2str(flags, buf, len, bridge_flags, ARRAY_SIZE(bridge_flags));
+}
+
+int rtnl_link_bridge_str2flags(const char *name)
+{
+       return __str2flags(name, bridge_flags, ARRAY_SIZE(bridge_flags));
+}
+
+/** @} */
+
 static struct rtnl_link_af_ops bridge_ops = {
        .ao_family                      = AF_BRIDGE,
        .ao_alloc                       = &bridge_alloc,
index d4c4b6a6bba9835963b9917470882fa6feaf7d41..2d72bd72b7c2c856734cc16838ec8cc5781845be 100644 (file)
@@ -254,6 +254,13 @@ extern int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *);
 
 /* <netlink/route/link/bridge.h> */
 
+enum rtnl_link_bridge_flags {
+       RTNL_BRIDGE_HAIRPIN_MODE        = 0x0001,
+       RTNL_BRIDGE_BPDU_GUARD          = 0x0002,
+       RTNL_BRIDGE_ROOT_BLOCK          = 0x0004,
+       RTNL_BRIDGE_FAST_LEAVE          = 0x0008,
+};
+
 extern int     rtnl_link_is_bridge(struct rtnl_link *);
 extern int     rtnl_link_bridge_has_ext_info(struct rtnl_link *);
 
@@ -270,6 +277,9 @@ extern int  rtnl_link_bridge_unset_flags(struct rtnl_link *, unsigned int);
 extern int     rtnl_link_bridge_set_flags(struct rtnl_link *, unsigned int);
 extern int     rtnl_link_bridge_get_flags(struct rtnl_link *);
 
+extern char * rtnl_link_bridge_flags2str(int, char *, size_t);
+extern int     rtnl_link_bridge_str2flags(const char *);
+
 /* <netlink/route/link/inet.h> */
 %cstring_output_maxsize(char *buf, size_t len)
 extern const char *rtnl_link_inet_devconf2str(int, char *buf, size_t len);
index 09d9334cb65031f043f335411157a478a65539c7..549b0925d94f5073717a950ee75f03454940cda2 100644 (file)
@@ -76,6 +76,41 @@ class BRIDGELink(object):
             raise ValueError()
         capi.rtnl_link_bridge_set_cost(self._link, int(cost))
 
+    @property
+    @netlink.nlattr(type=str)
+    def flags(self):
+        """ BRIDGE 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
+        """
+        self.bridge_assert_ext_info()
+        flags = capi.rtnl_link_bridge_get_flags(self._link)
+        return capi.rtnl_link_bridge_flags2str(flags, 256)[0].split(',')
+
+    def _set_flag(self, flag):
+        if flag.startswith('-'):
+            i = capi.rtnl_link_bridge_str2flags(flag[1:])
+            capi.rtnl_link_bridge_unset_flags(self._link, i)
+        elif flag.startswith('+'):
+            i = capi.rtnl_link_bridge_str2flags(flag[1:])
+            capi.rtnl_link_bridge_set_flags(self._link, i)
+        else:
+            i = capi.rtnl_link_bridge_str2flags(flag)
+            capi.rtnl_link_bridge_set_flags(self._link, i)
+
+    @flags.setter
+    def flags(self, value):
+        self.bridge_assert_ext_info()
+        if type(value) is list:
+            for flag in value:
+                self._set_flag(flag)
+        else:
+            self._set_flag(value)
+
     def brief(self):
         return 'bridge-has-ext-info {0}'.format(self._has_ext_info)