python: add bridge flags API
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>
This commit is contained in:
parent
07669b0b80
commit
978bb85c7a
4 changed files with 72 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue