python: add basic netlink protocol bridge interface support
Implements basic bridge interface support using netlink protocol Signed-off-by: Nicolas PLANEL <nicolas.planel@enovance.com> Signed-off-by: Thomas Graf <tgraf@suug.ch>
This commit is contained in:
parent
cb034e12a4
commit
defebe30c6
3 changed files with 118 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
|||
#include <netlink/route/link/vlan.h>
|
||||
#include <netlink/route/link/macvlan.h>
|
||||
#include <netlink/route/link/vxlan.h>
|
||||
#include <netlink/route/link/bridge.h>
|
||||
#include <netlink/route/link/inet.h>
|
||||
|
||||
#include <netlink/route/tc.h>
|
||||
|
@ -144,6 +145,9 @@ extern int rtnl_link_set_stat(struct rtnl_link *, const unsigned int, const uint
|
|||
extern int rtnl_link_set_type(struct rtnl_link *, const char *);
|
||||
extern char *rtnl_link_get_type(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_enslave(struct nl_sock * sock, struct rtnl_link * master, struct rtnl_link * slave);
|
||||
extern int rtnl_link_release(struct nl_sock * sock, struct rtnl_link * slave);
|
||||
|
||||
/* <netlink/route/link/vlan.h> */
|
||||
|
||||
struct vlan_map
|
||||
|
@ -248,6 +252,24 @@ extern int rtnl_link_vxlan_get_l3miss(struct rtnl_link *);
|
|||
extern int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *);
|
||||
|
||||
/* <netlink/route/link/bridge.h> */
|
||||
|
||||
extern int rtnl_link_is_bridge(struct rtnl_link *);
|
||||
extern int rtnl_link_bridge_has_ext_info(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_bridge_set_port_state(struct rtnl_link *, uint8_t );
|
||||
extern int rtnl_link_bridge_get_port_state(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_bridge_set_priority(struct rtnl_link *, uint16_t);
|
||||
extern int rtnl_link_bridge_get_priority(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_bridge_set_cost(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_bridge_get_cost(struct rtnl_link *, uint32_t *);
|
||||
|
||||
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 *);
|
||||
|
||||
/* <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);
|
||||
|
|
|
@ -374,6 +374,18 @@ class Link(netlink.Object):
|
|||
|
||||
return capi.rtnl_link_get_stat(self._rtnl_link, stat)
|
||||
|
||||
def enslave(self, slave, sock=None):
|
||||
if not sock:
|
||||
sock = netlink.lookup_socket(netlink.NETLINK_ROUTE)
|
||||
|
||||
return capi.rtnl_link_enslave(sock._sock, self._rtnl_link, slave._rtnl_link)
|
||||
|
||||
def release(self, slave, sock=None):
|
||||
if not sock:
|
||||
sock = netlink.lookup_socket(netlink.NETLINK_ROUTE)
|
||||
|
||||
return capi.rtnl_link_release(sock._sock, self._rtnl_link, slave._rtnl_link)
|
||||
|
||||
def add(self, sock=None, flags=None):
|
||||
if not sock:
|
||||
sock = netlink.lookup_socket(netlink.NETLINK_ROUTE)
|
||||
|
|
84
python/netlink/route/links/bridge.py
Normal file
84
python/netlink/route/links/bridge.py
Normal file
|
@ -0,0 +1,84 @@
|
|||
#
|
||||
# Copyright (c) 2013 Nicolas PLANEL <nicolas.planel@enovance.com>
|
||||
#
|
||||
|
||||
"""BRIDGE network link
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
from ... import core as netlink
|
||||
from .. import capi as capi
|
||||
|
||||
class BRIDGELink(object):
|
||||
def __init__(self, link):
|
||||
self._link = link
|
||||
self._has_ext_info = capi.rtnl_link_bridge_has_ext_info(self._link)
|
||||
self._port_state_values = ['disabled','listening','learning','forwarding','blocking']
|
||||
|
||||
def bridge_assert_ext_info(self):
|
||||
if self._has_ext_info == False:
|
||||
print """
|
||||
Please update your kernel to be able to call this method.
|
||||
Your current kernel bridge version is too old to support this extention.
|
||||
"""
|
||||
raise RuntimeWarning()
|
||||
|
||||
def port_state2str(self, state):
|
||||
return self._port_state_values[state]
|
||||
|
||||
def str2port_state(self, str):
|
||||
for value, port in enumerate(self._port_state_values):
|
||||
if str.lower() == port:
|
||||
return value
|
||||
raise ValueError()
|
||||
|
||||
@property
|
||||
@netlink.nlattr(type=int)
|
||||
def port_state(self):
|
||||
"""bridge state :
|
||||
%s
|
||||
""" % (self.port_state)
|
||||
return capi.rtnl_link_bridge_get_state(self._link)
|
||||
|
||||
@port_state.setter
|
||||
def port_state(self, state):
|
||||
capi.rtnl_link_bridge_set_state(self._link, int(state))
|
||||
|
||||
@property
|
||||
@netlink.nlattr(type=int)
|
||||
def priority(self):
|
||||
"""bridge prio
|
||||
"""
|
||||
bridge_assert_ext_info()
|
||||
return capi.rtnl_link_bridge_get_prio(self._link)
|
||||
|
||||
@priority.setter
|
||||
def priority(self, prio):
|
||||
bridge_assert_ext_info()
|
||||
if prio < 0 or prio >= 2**16:
|
||||
raise ValueError()
|
||||
capi.rtnl_link_bridge_set_prio(self._link, int(prio))
|
||||
|
||||
@property
|
||||
@netlink.nlattr(type=int)
|
||||
def cost(self):
|
||||
"""bridge prio
|
||||
"""
|
||||
bridge_assert_ext_info()
|
||||
return capi.rtnl_link_bridge_get_cost(self._link)
|
||||
|
||||
@cost.setter
|
||||
def cost(self, cost):
|
||||
bridge_assert_ext_info()
|
||||
if cost < 0 or cost >= 2**32:
|
||||
raise ValueError()
|
||||
capi.rtnl_link_bridge_set_cost(self._link, int(cost))
|
||||
|
||||
def brief(self):
|
||||
return 'bridge-has-ext-info {0}'.format(self._has_ext_info)
|
||||
|
||||
def init(link):
|
||||
link.bridge = BRIDGELink(link._rtnl_link)
|
||||
return link.bridge
|
Loading…
Add table
Reference in a new issue