dect
/
libnl
Archived
13
0
Fork 0

Work on libnl-python

Changes too numerous to describe them
This commit is contained in:
Thomas Graf 2011-06-10 13:55:29 +02:00
parent 09210d9619
commit e56eb065b2
20 changed files with 21477 additions and 323 deletions

BIN
python/netlink/__init__.pyc Normal file

Binary file not shown.

View File

@ -120,6 +120,8 @@ extern const char *nl_geterror(int);
extern double nl_cancel_down_bytes(unsigned long long, char **);
extern double nl_cancel_down_bits(unsigned long long, char **);
%cstring_output_maxsize(char *buf, size_t len)
extern int nl_rate2str(unsigned long long rate, int type, char *buf, size_t len);
extern double nl_cancel_down_us(uint32_t, char **);
extern long nl_size2int(const char *);

773
python/netlink/capi.py Normal file
View File

@ -0,0 +1,773 @@
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 1.3.40
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
from sys import version_info
if version_info >= (3,0,0):
new_instancemethod = lambda func, inst, cls: _capi.SWIG_PyInstanceMethod_New(func)
else:
from new import instancemethod as new_instancemethod
if version_info >= (2,6,0):
def swig_import_helper():
from os.path import dirname
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_capi', [dirname(__file__)])
except ImportError:
import _capi
return _capi
if fp is not None:
try:
_mod = imp.load_module('_capi', fp, pathname, description)
finally:
fp.close()
return _mod
_capi = swig_import_helper()
del swig_import_helper
else:
import _capi
del version_info
try:
_swig_property = property
except NameError:
pass # Python < 2.2 doesn't have 'property'.
def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
if (name == "thisown"): return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'SwigPyObject':
self.__dict__[name] = value
return
method = class_type.__swig_setmethods__.get(name,None)
if method: return method(self,value)
if (not static) or hasattr(self,name):
self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
def _swig_setattr(self,class_type,name,value):
return _swig_setattr_nondynamic(self,class_type,name,value,0)
def _swig_getattr(self,class_type,name):
if (name == "thisown"): return self.this.own()
method = class_type.__swig_getmethods__.get(name,None)
if method: return method(self)
raise AttributeError(name)
def _swig_repr(self):
try: strthis = "proxy of " + self.this.__repr__()
except: strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
try:
_object = object
_newclass = 1
except AttributeError:
class _object : pass
_newclass = 0
def _swig_setattr_nondynamic_method(set):
def set_attr(self,name,value):
if (name == "thisown"): return self.this.own(value)
if hasattr(self,name) or (name == "this"):
set(self,name,value)
else:
raise AttributeError("You cannot add attributes to %s" % self)
return set_attr
def alloc_dump_params():
return _capi.alloc_dump_params()
alloc_dump_params = _capi.alloc_dump_params
def free_dump_params(*args):
return _capi.free_dump_params(*args)
free_dump_params = _capi.free_dump_params
NL_DUMP_LINE = _capi.NL_DUMP_LINE
NL_DUMP_DETAILS = _capi.NL_DUMP_DETAILS
NL_DUMP_STATS = _capi.NL_DUMP_STATS
__NL_DUMP_MAX = _capi.__NL_DUMP_MAX
class nl_dump_params(object):
thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
dp_type = _swig_property(_capi.nl_dump_params_dp_type_get, _capi.nl_dump_params_dp_type_set)
dp_prefix = _swig_property(_capi.nl_dump_params_dp_prefix_get, _capi.nl_dump_params_dp_prefix_set)
dp_print_index = _swig_property(_capi.nl_dump_params_dp_print_index_get, _capi.nl_dump_params_dp_print_index_set)
dp_dump_msgtype = _swig_property(_capi.nl_dump_params_dp_dump_msgtype_get, _capi.nl_dump_params_dp_dump_msgtype_set)
dp_cb = _swig_property(_capi.nl_dump_params_dp_cb_get, _capi.nl_dump_params_dp_cb_set)
dp_nl_cb = _swig_property(_capi.nl_dump_params_dp_nl_cb_get, _capi.nl_dump_params_dp_nl_cb_set)
dp_data = _swig_property(_capi.nl_dump_params_dp_data_get, _capi.nl_dump_params_dp_data_set)
dp_fd = _swig_property(_capi.nl_dump_params_dp_fd_get, _capi.nl_dump_params_dp_fd_set)
dp_buf = _swig_property(_capi.nl_dump_params_dp_buf_get, _capi.nl_dump_params_dp_buf_set)
dp_buflen = _swig_property(_capi.nl_dump_params_dp_buflen_get, _capi.nl_dump_params_dp_buflen_set)
dp_pre_dump = _swig_property(_capi.nl_dump_params_dp_pre_dump_get, _capi.nl_dump_params_dp_pre_dump_set)
dp_ivar = _swig_property(_capi.nl_dump_params_dp_ivar_get, _capi.nl_dump_params_dp_ivar_set)
dp_line = _swig_property(_capi.nl_dump_params_dp_line_get, _capi.nl_dump_params_dp_line_set)
__swig_destroy__ = _capi.delete_nl_dump_params
nl_dump_params_swigregister = _capi.nl_dump_params_swigregister
nl_dump_params_swigregister(nl_dump_params)
def nl_geterror(*args):
return _capi.nl_geterror(*args)
nl_geterror = _capi.nl_geterror
def nl_cancel_down_bytes(*args):
return _capi.nl_cancel_down_bytes(*args)
nl_cancel_down_bytes = _capi.nl_cancel_down_bytes
def nl_cancel_down_bits(*args):
return _capi.nl_cancel_down_bits(*args)
nl_cancel_down_bits = _capi.nl_cancel_down_bits
def nl_rate2str(*args):
return _capi.nl_rate2str(*args)
nl_rate2str = _capi.nl_rate2str
def nl_cancel_down_us(*args):
return _capi.nl_cancel_down_us(*args)
nl_cancel_down_us = _capi.nl_cancel_down_us
def nl_size2int(*args):
return _capi.nl_size2int(*args)
nl_size2int = _capi.nl_size2int
def nl_size2str(*args):
return _capi.nl_size2str(*args)
nl_size2str = _capi.nl_size2str
def nl_prob2int(*args):
return _capi.nl_prob2int(*args)
nl_prob2int = _capi.nl_prob2int
def nl_get_user_hz():
return _capi.nl_get_user_hz()
nl_get_user_hz = _capi.nl_get_user_hz
def nl_us2ticks(*args):
return _capi.nl_us2ticks(*args)
nl_us2ticks = _capi.nl_us2ticks
def nl_ticks2us(*args):
return _capi.nl_ticks2us(*args)
nl_ticks2us = _capi.nl_ticks2us
def nl_str2msec(*args):
return _capi.nl_str2msec(*args)
nl_str2msec = _capi.nl_str2msec
def nl_msec2str(*args):
return _capi.nl_msec2str(*args)
nl_msec2str = _capi.nl_msec2str
def nl_llproto2str(*args):
return _capi.nl_llproto2str(*args)
nl_llproto2str = _capi.nl_llproto2str
def nl_str2llproto(*args):
return _capi.nl_str2llproto(*args)
nl_str2llproto = _capi.nl_str2llproto
def nl_ether_proto2str(*args):
return _capi.nl_ether_proto2str(*args)
nl_ether_proto2str = _capi.nl_ether_proto2str
def nl_str2ether_proto(*args):
return _capi.nl_str2ether_proto(*args)
nl_str2ether_proto = _capi.nl_str2ether_proto
def nl_ip_proto2str(*args):
return _capi.nl_ip_proto2str(*args)
nl_ip_proto2str = _capi.nl_ip_proto2str
def nl_str2ip_proto(*args):
return _capi.nl_str2ip_proto(*args)
nl_str2ip_proto = _capi.nl_str2ip_proto
def nl_new_line(*args):
return _capi.nl_new_line(*args)
nl_new_line = _capi.nl_new_line
def nl_dump(*args):
return _capi.nl_dump(*args)
nl_dump = _capi.nl_dump
def nl_dump_line(*args):
return _capi.nl_dump_line(*args)
nl_dump_line = _capi.nl_dump_line
def nl_connect(*args):
return _capi.nl_connect(*args)
nl_connect = _capi.nl_connect
def nl_close(*args):
return _capi.nl_close(*args)
nl_close = _capi.nl_close
def nl_pickup(*args):
return _capi.nl_pickup(*args)
nl_pickup = _capi.nl_pickup
def nl_socket_alloc():
return _capi.nl_socket_alloc()
nl_socket_alloc = _capi.nl_socket_alloc
def nl_socket_alloc_cb(*args):
return _capi.nl_socket_alloc_cb(*args)
nl_socket_alloc_cb = _capi.nl_socket_alloc_cb
def nl_socket_free(*args):
return _capi.nl_socket_free(*args)
nl_socket_free = _capi.nl_socket_free
def nl_socket_get_local_port(*args):
return _capi.nl_socket_get_local_port(*args)
nl_socket_get_local_port = _capi.nl_socket_get_local_port
def nl_socket_set_local_port(*args):
return _capi.nl_socket_set_local_port(*args)
nl_socket_set_local_port = _capi.nl_socket_set_local_port
def nl_socket_get_peer_port(*args):
return _capi.nl_socket_get_peer_port(*args)
nl_socket_get_peer_port = _capi.nl_socket_get_peer_port
def nl_socket_set_peer_port(*args):
return _capi.nl_socket_set_peer_port(*args)
nl_socket_set_peer_port = _capi.nl_socket_set_peer_port
def nl_socket_get_peer_groups(*args):
return _capi.nl_socket_get_peer_groups(*args)
nl_socket_get_peer_groups = _capi.nl_socket_get_peer_groups
def nl_socket_set_peer_groups(*args):
return _capi.nl_socket_set_peer_groups(*args)
nl_socket_set_peer_groups = _capi.nl_socket_set_peer_groups
def nl_socket_set_buffer_size(*args):
return _capi.nl_socket_set_buffer_size(*args)
nl_socket_set_buffer_size = _capi.nl_socket_set_buffer_size
def nlmsg_size(*args):
return _capi.nlmsg_size(*args)
nlmsg_size = _capi.nlmsg_size
def nlmsg_total_size(*args):
return _capi.nlmsg_total_size(*args)
nlmsg_total_size = _capi.nlmsg_total_size
def nlmsg_padlen(*args):
return _capi.nlmsg_padlen(*args)
nlmsg_padlen = _capi.nlmsg_padlen
def nlmsg_data(*args):
return _capi.nlmsg_data(*args)
nlmsg_data = _capi.nlmsg_data
def nlmsg_datalen(*args):
return _capi.nlmsg_datalen(*args)
nlmsg_datalen = _capi.nlmsg_datalen
def nlmsg_tail(*args):
return _capi.nlmsg_tail(*args)
nlmsg_tail = _capi.nlmsg_tail
def nlmsg_attrdata(*args):
return _capi.nlmsg_attrdata(*args)
nlmsg_attrdata = _capi.nlmsg_attrdata
def nlmsg_attrlen(*args):
return _capi.nlmsg_attrlen(*args)
nlmsg_attrlen = _capi.nlmsg_attrlen
def nlmsg_valid_hdr(*args):
return _capi.nlmsg_valid_hdr(*args)
nlmsg_valid_hdr = _capi.nlmsg_valid_hdr
def nlmsg_ok(*args):
return _capi.nlmsg_ok(*args)
nlmsg_ok = _capi.nlmsg_ok
def nlmsg_next(*args):
return _capi.nlmsg_next(*args)
nlmsg_next = _capi.nlmsg_next
def nlmsg_parse(*args):
return _capi.nlmsg_parse(*args)
nlmsg_parse = _capi.nlmsg_parse
def nlmsg_find_attr(*args):
return _capi.nlmsg_find_attr(*args)
nlmsg_find_attr = _capi.nlmsg_find_attr
def nlmsg_validate(*args):
return _capi.nlmsg_validate(*args)
nlmsg_validate = _capi.nlmsg_validate
def nlmsg_alloc():
return _capi.nlmsg_alloc()
nlmsg_alloc = _capi.nlmsg_alloc
def nlmsg_alloc_size(*args):
return _capi.nlmsg_alloc_size(*args)
nlmsg_alloc_size = _capi.nlmsg_alloc_size
def nlmsg_alloc_simple(*args):
return _capi.nlmsg_alloc_simple(*args)
nlmsg_alloc_simple = _capi.nlmsg_alloc_simple
def nlmsg_set_default_size(*args):
return _capi.nlmsg_set_default_size(*args)
nlmsg_set_default_size = _capi.nlmsg_set_default_size
def nlmsg_inherit(*args):
return _capi.nlmsg_inherit(*args)
nlmsg_inherit = _capi.nlmsg_inherit
def nlmsg_convert(*args):
return _capi.nlmsg_convert(*args)
nlmsg_convert = _capi.nlmsg_convert
def nlmsg_reserve(*args):
return _capi.nlmsg_reserve(*args)
nlmsg_reserve = _capi.nlmsg_reserve
def nlmsg_append(*args):
return _capi.nlmsg_append(*args)
nlmsg_append = _capi.nlmsg_append
def nlmsg_expand(*args):
return _capi.nlmsg_expand(*args)
nlmsg_expand = _capi.nlmsg_expand
def nlmsg_put(*args):
return _capi.nlmsg_put(*args)
nlmsg_put = _capi.nlmsg_put
def nlmsg_hdr(*args):
return _capi.nlmsg_hdr(*args)
nlmsg_hdr = _capi.nlmsg_hdr
def nlmsg_get(*args):
return _capi.nlmsg_get(*args)
nlmsg_get = _capi.nlmsg_get
def nlmsg_free(*args):
return _capi.nlmsg_free(*args)
nlmsg_free = _capi.nlmsg_free
def nlmsg_set_proto(*args):
return _capi.nlmsg_set_proto(*args)
nlmsg_set_proto = _capi.nlmsg_set_proto
def nlmsg_get_proto(*args):
return _capi.nlmsg_get_proto(*args)
nlmsg_get_proto = _capi.nlmsg_get_proto
def nlmsg_get_max_size(*args):
return _capi.nlmsg_get_max_size(*args)
nlmsg_get_max_size = _capi.nlmsg_get_max_size
def nlmsg_set_src(*args):
return _capi.nlmsg_set_src(*args)
nlmsg_set_src = _capi.nlmsg_set_src
def nlmsg_get_src(*args):
return _capi.nlmsg_get_src(*args)
nlmsg_get_src = _capi.nlmsg_get_src
def nlmsg_set_dst(*args):
return _capi.nlmsg_set_dst(*args)
nlmsg_set_dst = _capi.nlmsg_set_dst
def nlmsg_get_dst(*args):
return _capi.nlmsg_get_dst(*args)
nlmsg_get_dst = _capi.nlmsg_get_dst
def nlmsg_set_creds(*args):
return _capi.nlmsg_set_creds(*args)
nlmsg_set_creds = _capi.nlmsg_set_creds
def nlmsg_get_creds(*args):
return _capi.nlmsg_get_creds(*args)
nlmsg_get_creds = _capi.nlmsg_get_creds
def nl_nlmsgtype2str(*args):
return _capi.nl_nlmsgtype2str(*args)
nl_nlmsgtype2str = _capi.nl_nlmsgtype2str
def nl_str2nlmsgtype(*args):
return _capi.nl_str2nlmsgtype(*args)
nl_str2nlmsgtype = _capi.nl_str2nlmsgtype
def nl_nlmsg_flags2str(*args):
return _capi.nl_nlmsg_flags2str(*args)
nl_nlmsg_flags2str = _capi.nl_nlmsg_flags2str
def nl_msg_parse(*args):
return _capi.nl_msg_parse(*args)
nl_msg_parse = _capi.nl_msg_parse
def nl_msg_dump(*args):
return _capi.nl_msg_dump(*args)
nl_msg_dump = _capi.nl_msg_dump
def cast_obj(*args):
return _capi.cast_obj(*args)
cast_obj = _capi.cast_obj
def object_alloc_name(*args):
return _capi.object_alloc_name(*args)
object_alloc_name = _capi.object_alloc_name
def nl_object_alloc(*args):
return _capi.nl_object_alloc(*args)
nl_object_alloc = _capi.nl_object_alloc
def nl_object_free(*args):
return _capi.nl_object_free(*args)
nl_object_free = _capi.nl_object_free
def nl_object_clone(*args):
return _capi.nl_object_clone(*args)
nl_object_clone = _capi.nl_object_clone
def nl_object_get(*args):
return _capi.nl_object_get(*args)
nl_object_get = _capi.nl_object_get
def nl_object_put(*args):
return _capi.nl_object_put(*args)
nl_object_put = _capi.nl_object_put
def nl_object_shared(*args):
return _capi.nl_object_shared(*args)
nl_object_shared = _capi.nl_object_shared
def nl_object_dump_buf(*args):
return _capi.nl_object_dump_buf(*args)
nl_object_dump_buf = _capi.nl_object_dump_buf
def nl_object_dump(*args):
return _capi.nl_object_dump(*args)
nl_object_dump = _capi.nl_object_dump
def nl_object_identical(*args):
return _capi.nl_object_identical(*args)
nl_object_identical = _capi.nl_object_identical
def nl_object_diff(*args):
return _capi.nl_object_diff(*args)
nl_object_diff = _capi.nl_object_diff
def nl_object_match_filter(*args):
return _capi.nl_object_match_filter(*args)
nl_object_match_filter = _capi.nl_object_match_filter
def nl_object_attrs2str(*args):
return _capi.nl_object_attrs2str(*args)
nl_object_attrs2str = _capi.nl_object_attrs2str
def nl_object_attr_list(*args):
return _capi.nl_object_attr_list(*args)
nl_object_attr_list = _capi.nl_object_attr_list
def nl_object_mark(*args):
return _capi.nl_object_mark(*args)
nl_object_mark = _capi.nl_object_mark
def nl_object_unmark(*args):
return _capi.nl_object_unmark(*args)
nl_object_unmark = _capi.nl_object_unmark
def nl_object_is_marked(*args):
return _capi.nl_object_is_marked(*args)
nl_object_is_marked = _capi.nl_object_is_marked
def nl_object_get_refcnt(*args):
return _capi.nl_object_get_refcnt(*args)
nl_object_get_refcnt = _capi.nl_object_get_refcnt
def alloc_cache_name(*args):
return _capi.alloc_cache_name(*args)
alloc_cache_name = _capi.alloc_cache_name
def alloc_cache_mngr(*args):
return _capi.alloc_cache_mngr(*args)
alloc_cache_mngr = _capi.alloc_cache_mngr
def cache_mngr_add(*args):
return _capi.cache_mngr_add(*args)
cache_mngr_add = _capi.cache_mngr_add
def nl_cache_nitems(*args):
return _capi.nl_cache_nitems(*args)
nl_cache_nitems = _capi.nl_cache_nitems
def nl_cache_nitems_filter(*args):
return _capi.nl_cache_nitems_filter(*args)
nl_cache_nitems_filter = _capi.nl_cache_nitems_filter
def nl_cache_get_ops(*args):
return _capi.nl_cache_get_ops(*args)
nl_cache_get_ops = _capi.nl_cache_get_ops
def nl_cache_get_first(*args):
return _capi.nl_cache_get_first(*args)
nl_cache_get_first = _capi.nl_cache_get_first
def nl_cache_get_last(*args):
return _capi.nl_cache_get_last(*args)
nl_cache_get_last = _capi.nl_cache_get_last
def nl_cache_get_next(*args):
return _capi.nl_cache_get_next(*args)
nl_cache_get_next = _capi.nl_cache_get_next
def nl_cache_get_prev(*args):
return _capi.nl_cache_get_prev(*args)
nl_cache_get_prev = _capi.nl_cache_get_prev
def nl_cache_alloc(*args):
return _capi.nl_cache_alloc(*args)
nl_cache_alloc = _capi.nl_cache_alloc
def nl_cache_subset(*args):
return _capi.nl_cache_subset(*args)
nl_cache_subset = _capi.nl_cache_subset
def nl_cache_clear(*args):
return _capi.nl_cache_clear(*args)
nl_cache_clear = _capi.nl_cache_clear
def nl_cache_free(*args):
return _capi.nl_cache_free(*args)
nl_cache_free = _capi.nl_cache_free
def nl_cache_add(*args):
return _capi.nl_cache_add(*args)
nl_cache_add = _capi.nl_cache_add
def nl_cache_parse_and_add(*args):
return _capi.nl_cache_parse_and_add(*args)
nl_cache_parse_and_add = _capi.nl_cache_parse_and_add
def nl_cache_remove(*args):
return _capi.nl_cache_remove(*args)
nl_cache_remove = _capi.nl_cache_remove
def nl_cache_refill(*args):
return _capi.nl_cache_refill(*args)
nl_cache_refill = _capi.nl_cache_refill
def nl_cache_pickup(*args):
return _capi.nl_cache_pickup(*args)
nl_cache_pickup = _capi.nl_cache_pickup
def nl_cache_resync(*args):
return _capi.nl_cache_resync(*args)
nl_cache_resync = _capi.nl_cache_resync
def nl_cache_include(*args):
return _capi.nl_cache_include(*args)
nl_cache_include = _capi.nl_cache_include
def nl_cache_set_arg1(*args):
return _capi.nl_cache_set_arg1(*args)
nl_cache_set_arg1 = _capi.nl_cache_set_arg1
def nl_cache_set_arg2(*args):
return _capi.nl_cache_set_arg2(*args)
nl_cache_set_arg2 = _capi.nl_cache_set_arg2
def nl_cache_is_empty(*args):
return _capi.nl_cache_is_empty(*args)
nl_cache_is_empty = _capi.nl_cache_is_empty
def nl_cache_search(*args):
return _capi.nl_cache_search(*args)
nl_cache_search = _capi.nl_cache_search
def nl_cache_mark_all(*args):
return _capi.nl_cache_mark_all(*args)
nl_cache_mark_all = _capi.nl_cache_mark_all
def nl_cache_dump(*args):
return _capi.nl_cache_dump(*args)
nl_cache_dump = _capi.nl_cache_dump
def nl_cache_dump_filter(*args):
return _capi.nl_cache_dump_filter(*args)
nl_cache_dump_filter = _capi.nl_cache_dump_filter
def nl_cache_foreach(*args):
return _capi.nl_cache_foreach(*args)
nl_cache_foreach = _capi.nl_cache_foreach
def nl_cache_foreach_filter(*args):
return _capi.nl_cache_foreach_filter(*args)
nl_cache_foreach_filter = _capi.nl_cache_foreach_filter
def nl_cache_ops_lookup(*args):
return _capi.nl_cache_ops_lookup(*args)
nl_cache_ops_lookup = _capi.nl_cache_ops_lookup
def nl_cache_ops_associate(*args):
return _capi.nl_cache_ops_associate(*args)
nl_cache_ops_associate = _capi.nl_cache_ops_associate
def nl_msgtype_lookup(*args):
return _capi.nl_msgtype_lookup(*args)
nl_msgtype_lookup = _capi.nl_msgtype_lookup
def nl_cache_ops_foreach(*args):
return _capi.nl_cache_ops_foreach(*args)
nl_cache_ops_foreach = _capi.nl_cache_ops_foreach
def nl_cache_mngt_register(*args):
return _capi.nl_cache_mngt_register(*args)
nl_cache_mngt_register = _capi.nl_cache_mngt_register
def nl_cache_mngt_unregister(*args):
return _capi.nl_cache_mngt_unregister(*args)
nl_cache_mngt_unregister = _capi.nl_cache_mngt_unregister
def nl_cache_mngt_provide(*args):
return _capi.nl_cache_mngt_provide(*args)
nl_cache_mngt_provide = _capi.nl_cache_mngt_provide
def nl_cache_mngt_unprovide(*args):
return _capi.nl_cache_mngt_unprovide(*args)
nl_cache_mngt_unprovide = _capi.nl_cache_mngt_unprovide
def nl_cache_mngt_require(*args):
return _capi.nl_cache_mngt_require(*args)
nl_cache_mngt_require = _capi.nl_cache_mngt_require
NL_AUTO_PROVIDE = _capi.NL_AUTO_PROVIDE
def nl_cache_mngr_get_fd(*args):
return _capi.nl_cache_mngr_get_fd(*args)
nl_cache_mngr_get_fd = _capi.nl_cache_mngr_get_fd
def nl_cache_mngr_poll(*args):
return _capi.nl_cache_mngr_poll(*args)
nl_cache_mngr_poll = _capi.nl_cache_mngr_poll
def nl_cache_mngr_data_ready(*args):
return _capi.nl_cache_mngr_data_ready(*args)
nl_cache_mngr_data_ready = _capi.nl_cache_mngr_data_ready
def nl_cache_mngr_free(*args):
return _capi.nl_cache_mngr_free(*args)
nl_cache_mngr_free = _capi.nl_cache_mngr_free
def addr_parse(*args):
return _capi.addr_parse(*args)
addr_parse = _capi.addr_parse
def nl_addr_alloc(*args):
return _capi.nl_addr_alloc(*args)
nl_addr_alloc = _capi.nl_addr_alloc
def nl_addr_alloc_attr(*args):
return _capi.nl_addr_alloc_attr(*args)
nl_addr_alloc_attr = _capi.nl_addr_alloc_attr
def nl_addr_build(*args):
return _capi.nl_addr_build(*args)
nl_addr_build = _capi.nl_addr_build
def nl_addr_clone(*args):
return _capi.nl_addr_clone(*args)
nl_addr_clone = _capi.nl_addr_clone
def nl_addr_get(*args):
return _capi.nl_addr_get(*args)
nl_addr_get = _capi.nl_addr_get
def nl_addr_put(*args):
return _capi.nl_addr_put(*args)
nl_addr_put = _capi.nl_addr_put
def nl_addr_shared(*args):
return _capi.nl_addr_shared(*args)
nl_addr_shared = _capi.nl_addr_shared
def nl_addr_cmp(*args):
return _capi.nl_addr_cmp(*args)
nl_addr_cmp = _capi.nl_addr_cmp
def nl_addr_cmp_prefix(*args):
return _capi.nl_addr_cmp_prefix(*args)
nl_addr_cmp_prefix = _capi.nl_addr_cmp_prefix
def nl_addr_iszero(*args):
return _capi.nl_addr_iszero(*args)
nl_addr_iszero = _capi.nl_addr_iszero
def nl_addr_valid(*args):
return _capi.nl_addr_valid(*args)
nl_addr_valid = _capi.nl_addr_valid
def nl_addr_guess_family(*args):
return _capi.nl_addr_guess_family(*args)
nl_addr_guess_family = _capi.nl_addr_guess_family
def nl_addr_fill_sockaddr(*args):
return _capi.nl_addr_fill_sockaddr(*args)
nl_addr_fill_sockaddr = _capi.nl_addr_fill_sockaddr
def nl_addr_info(*args):
return _capi.nl_addr_info(*args)
nl_addr_info = _capi.nl_addr_info
def nl_addr_resolve(*args):
return _capi.nl_addr_resolve(*args)
nl_addr_resolve = _capi.nl_addr_resolve
def nl_addr_set_family(*args):
return _capi.nl_addr_set_family(*args)
nl_addr_set_family = _capi.nl_addr_set_family
def nl_addr_get_family(*args):
return _capi.nl_addr_get_family(*args)
nl_addr_get_family = _capi.nl_addr_get_family
def nl_addr_set_binary_addr(*args):
return _capi.nl_addr_set_binary_addr(*args)
nl_addr_set_binary_addr = _capi.nl_addr_set_binary_addr
def nl_addr_get_binary_addr(*args):
return _capi.nl_addr_get_binary_addr(*args)
nl_addr_get_binary_addr = _capi.nl_addr_get_binary_addr
def nl_addr_get_len(*args):
return _capi.nl_addr_get_len(*args)
nl_addr_get_len = _capi.nl_addr_get_len
def nl_addr_set_prefixlen(*args):
return _capi.nl_addr_set_prefixlen(*args)
nl_addr_set_prefixlen = _capi.nl_addr_set_prefixlen
def nl_addr_get_prefixlen(*args):
return _capi.nl_addr_get_prefixlen(*args)
nl_addr_get_prefixlen = _capi.nl_addr_get_prefixlen
def nl_af2str(*args):
return _capi.nl_af2str(*args)
nl_af2str = _capi.nl_af2str
def nl_str2af(*args):
return _capi.nl_str2af(*args)
nl_str2af = _capi.nl_str2af
def nl_addr2str(*args):
return _capi.nl_addr2str(*args)
nl_addr2str = _capi.nl_addr2str

BIN
python/netlink/capi.pyc Normal file

Binary file not shown.

9640
python/netlink/capi_wrap.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -254,6 +254,7 @@ class Object(object):
def __init__(self, obj_name, name, obj=None):
self._obj_name = obj_name
self._name = name
self._modules = []
if not obj:
obj = capi.object_alloc_name(self._obj_name)
@ -284,6 +285,45 @@ class Object(object):
"""Clone object"""
return self._new_instance(capi.nl_object_clone(self._nl_object))
def _module_lookup(self, path, constructor=None):
"""Lookup object specific module and load it
Object implementations consisting of multiple types may
offload some type specific code to separate modules which
are loadable on demand, e.g. a VLAN link or a specific
queueing discipline implementation.
Loads the module `path` and calls the constructor if
supplied or `module`.init()
The constructor/init function typically assigns a new
object covering the type specific implementation aspects
to the new object, e.g. link.vlan = VLANLink()
"""
try:
tmp = __import__(path)
except ImportError:
return
module = sys.modules[path]
if constructor:
ret = getattr(module, constructor)(self)
else:
ret = module.init(self)
if ret:
self._modules.append(ret)
def _module_brief(self):
ret = ''
for module in self._modules:
if hasattr(module, 'brief'):
ret += module.brief()
return ret
def dump(self, params=None):
"""Dump object as human readable text"""
if params is None:
@ -291,6 +331,7 @@ class Object(object):
capi.nl_object_dump(self._nl_object, params._dp)
#####################################################################
# mark
@property
@ -361,12 +402,15 @@ class Object(object):
class ObjIterator(object):
def __init__(self, cache, obj):
self._cache = cache
self._nl_object = None
capi.nl_object_get(obj)
self._nl_object = obj
self._first = 1
self._end = 0
if not obj:
self._end = 1
else:
capi.nl_object_get(obj)
self._nl_object = obj
self._first = 1
self._end = 0
def __del__(self):
if self._nl_object:
@ -415,21 +459,21 @@ class Cache(object):
raise NotImplementedError()
def __del(self):
capi.nl_cache_free(self._c_cache)
capi.nl_cache_free(self._nl_cache)
def __len__(self):
return capi.nl_cache_nitems(self._c_cache)
return capi.nl_cache_nitems(self._nl_cache)
def __iter__(self):
obj = capi.nl_cache_get_first(self._c_cache)
obj = capi.nl_cache_get_first(self._nl_cache)
return ObjIterator(self, obj)
def __reversed__(self):
obj = capi.nl_cache_get_last(self._c_cache)
obj = capi.nl_cache_get_last(self._nl_cache)
return ReverseObjIterator(self, obj)
def __contains__(self, item):
obj = capi.nl_cache_search(self._c_cache, item._nl_object)
obj = capi.nl_cache_search(self._nl_cache, item._nl_object)
if obj is None:
return False
else:
@ -458,7 +502,7 @@ class Cache(object):
if not filter:
raise ValueError()
c = capi.nl_cache_subset(self._c_cache, filter._nl_object)
c = capi.nl_cache_subset(self._nl_cache, filter._nl_object)
return self._new_cache(cache=c)
def dump(self, params=None, filter=None):
@ -469,28 +513,28 @@ class Cache(object):
if filter:
filter = filter._nl_object
capi.nl_cache_dump_filter(self._c_cache, params._dp, filter)
capi.nl_cache_dump_filter(self._nl_cache, params._dp, filter)
def clear(self):
"""Remove all cache entries"""
capi.nl_cache_clear(self._c_cache)
capi.nl_cache_clear(self._nl_cache)
# Called by sub classes to set first cache argument
def _set_arg1(self, arg):
self.arg1 = arg
capi.nl_cache_set_arg1(self._c_cache, arg)
capi.nl_cache_set_arg1(self._nl_cache, arg)
# Called by sub classes to set second cache argument
def _set_arg2(self, arg):
self.arg2 = arg
capi.nl_cache_set_arg2(self._c_cache, arg)
capi.nl_cache_set_arg2(self._nl_cache, arg)
def refill(self, socket=None):
"""Clear cache and refill it"""
if socket is None:
socket = lookup_socket(self._protocol)
capi.nl_cache_refill(socket._sock, self._c_cache)
capi.nl_cache_refill(socket._sock, self._nl_cache)
return self
def resync(self, socket=None, cb=None):
@ -498,7 +542,7 @@ class Cache(object):
if socket is None:
socket = lookup_socket(self._protocol)
capi.nl_cache_resync(socket._sock, self._c_cache, cb)
capi.nl_cache_resync(socket._sock, self._nl_cache, cb)
def provide(self):
"""Provide this cache to others
@ -510,7 +554,7 @@ class Cache(object):
link names
"""
capi.nl_cache_mngt_provide(self._c_cache)
capi.nl_cache_mngt_provide(self._nl_cache)
def unprovide(self):
"""Unprovide this cache
@ -519,7 +563,7 @@ class Cache(object):
has been handed out already, that reference will still
be valid.
"""
capi.nl_cache_mngt_unprovide(self._c_cache)
capi.nl_cache_mngt_unprovide(self._nl_cache)
###########################################################################
# Cache Manager (Work in Progress)
@ -708,7 +752,7 @@ class AbstractAddress(object):
#
attrs = {}
def attr(name, **kwds):
def add_attr(name, **kwds):
attrs[name] = {}
for k in kwds:
attrs[name][k] = kwds[k]
@ -726,6 +770,7 @@ def nlattr(name, **kwds):
return self._my_attr
"""
attrs[name] = {}
for k in kwds:
attrs[name][k] = kwds[k]

BIN
python/netlink/core.pyc Normal file

Binary file not shown.

View File

@ -27,7 +27,7 @@ class AddressCache(netlink.Cache):
cache = self._alloc_cache_name("route/addr")
self._protocol = netlink.NETLINK_ROUTE
self._c_cache = cache
self._nl_cache = cache
def __getitem__(self, key):
# Using ifindex=0 here implies that the local address itself
@ -38,7 +38,7 @@ class AddressCache(netlink.Cache):
if type(local) is str:
local = netlink.AbstractAddress(local)
addr = capi.rtnl_addr_get(self._c_cache, ifindex,
addr = capi.rtnl_addr_get(self._nl_cache, ifindex,
local._nl_addr)
if addr is None:
raise KeyError()

View File

@ -7,6 +7,10 @@
#include <netlink/route/tc.h>
#include <netlink/route/qdisc.h>
#include <netlink/route/class.h>
#include <netlink/route/classifier.h>
#include <netlink/route/qdisc/htb.h>
#include <netlink/route/addr.h>
%}
@ -231,6 +235,26 @@ extern int rtnl_classid_generate(const char *, uint32_t *, uint32_t);
return (struct rtnl_qdisc *) obj;
}
struct nl_object *class2obj(struct rtnl_class *cl)
{
return OBJ_CAST(cl);
}
struct rtnl_class *obj2class(struct nl_object *obj)
{
return (struct rtnl_class *) obj;
}
struct nl_object *cls2obj(struct rtnl_cls *cls)
{
return OBJ_CAST(cls);
}
struct rtnl_cls *obj2cls(struct nl_object *obj)
{
return (struct rtnl_cls *) obj;
}
struct rtnl_tc *obj2tc(struct nl_object *obj)
{
return TC_CAST(obj);
@ -260,6 +284,43 @@ extern int rtnl_qdisc_build_delete_request(struct rtnl_qdisc *,
struct nl_msg **);
extern int rtnl_qdisc_delete(struct nl_sock *, struct rtnl_qdisc *);
/* <netlink/route/classifier.h> */
extern struct rtnl_cls *rtnl_cls_alloc(void);
extern void rtnl_cls_put(struct rtnl_cls *);
extern int rtnl_cls_add(struct nl_sock *, struct rtnl_cls *, int);
extern int rtnl_cls_delete(struct nl_sock *, struct rtnl_cls *,
int);
extern void rtnl_cls_set_prio(struct rtnl_cls *, uint16_t);
extern uint16_t rtnl_cls_get_prio(struct rtnl_cls *);
extern void rtnl_cls_set_protocol(struct rtnl_cls *, uint16_t);
extern uint16_t rtnl_cls_get_protocol(struct rtnl_cls *);
/* <netlink/route/qdisc/htb.h> */
extern uint32_t rtnl_htb_get_rate2quantum(struct rtnl_qdisc *);
extern int rtnl_htb_set_rate2quantum(struct rtnl_qdisc *, uint32_t);
extern uint32_t rtnl_htb_get_defcls(struct rtnl_qdisc *);
extern int rtnl_htb_set_defcls(struct rtnl_qdisc *, uint32_t);
extern uint32_t rtnl_htb_get_prio(struct rtnl_class *);
extern int rtnl_htb_set_prio(struct rtnl_class *, uint32_t);
extern uint32_t rtnl_htb_get_rate(struct rtnl_class *);
extern int rtnl_htb_set_rate(struct rtnl_class *, uint32_t);
extern uint32_t rtnl_htb_get_ceil(struct rtnl_class *);
extern int rtnl_htb_set_ceil(struct rtnl_class *, uint32_t);
extern uint32_t rtnl_htb_get_rbuffer(struct rtnl_class *);
extern int rtnl_htb_set_rbuffer(struct rtnl_class *, uint32_t);
extern uint32_t rtnl_htb_get_cbuffer(struct rtnl_class *);
extern int rtnl_htb_set_cbuffer(struct rtnl_class *, uint32_t);
extern uint32_t rtnl_htb_get_quantum(struct rtnl_class *);
extern int rtnl_htb_set_quantum(struct rtnl_class *, uint32_t);
extern int rtnl_htb_get_level(struct rtnl_class *);
/* <netlink/route/addr.h> */
%inline %{

View File

@ -0,0 +1,830 @@
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 1.3.40
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
from sys import version_info
if version_info >= (3,0,0):
new_instancemethod = lambda func, inst, cls: _capi.SWIG_PyInstanceMethod_New(func)
else:
from new import instancemethod as new_instancemethod
if version_info >= (2,6,0):
def swig_import_helper():
from os.path import dirname
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_capi', [dirname(__file__)])
except ImportError:
import _capi
return _capi
if fp is not None:
try:
_mod = imp.load_module('_capi', fp, pathname, description)
finally:
fp.close()
return _mod
_capi = swig_import_helper()
del swig_import_helper
else:
import _capi
del version_info
try:
_swig_property = property
except NameError:
pass # Python < 2.2 doesn't have 'property'.
def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
if (name == "thisown"): return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'SwigPyObject':
self.__dict__[name] = value
return
method = class_type.__swig_setmethods__.get(name,None)
if method: return method(self,value)
if (not static) or hasattr(self,name):
self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
def _swig_setattr(self,class_type,name,value):
return _swig_setattr_nondynamic(self,class_type,name,value,0)
def _swig_getattr(self,class_type,name):
if (name == "thisown"): return self.this.own()
method = class_type.__swig_getmethods__.get(name,None)
if method: return method(self)
raise AttributeError(name)
def _swig_repr(self):
try: strthis = "proxy of " + self.this.__repr__()
except: strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
try:
_object = object
_newclass = 1
except AttributeError:
class _object : pass
_newclass = 0
def _swig_setattr_nondynamic_method(set):
def set_attr(self,name,value):
if (name == "thisown"): return self.this.own(value)
if hasattr(self,name) or (name == "this"):
set(self,name,value)
else:
raise AttributeError("You cannot add attributes to %s" % self)
return set_attr
def link2obj(*args):
return _capi.link2obj(*args)
link2obj = _capi.link2obj
def obj2link(*args):
return _capi.obj2link(*args)
obj2link = _capi.obj2link
def get_from_kernel(*args):
return _capi.get_from_kernel(*args)
get_from_kernel = _capi.get_from_kernel
def inet_get_conf(*args):
return _capi.inet_get_conf(*args)
inet_get_conf = _capi.inet_get_conf
def rtnl_scope2str(*args):
return _capi.rtnl_scope2str(*args)
rtnl_scope2str = _capi.rtnl_scope2str
def rtnl_str2scope(*args):
return _capi.rtnl_str2scope(*args)
rtnl_str2scope = _capi.rtnl_str2scope
def rtnl_link_alloc():
return _capi.rtnl_link_alloc()
rtnl_link_alloc = _capi.rtnl_link_alloc
def rtnl_link_get(*args):
return _capi.rtnl_link_get(*args)
rtnl_link_get = _capi.rtnl_link_get
def rtnl_link_get_by_name(*args):
return _capi.rtnl_link_get_by_name(*args)
rtnl_link_get_by_name = _capi.rtnl_link_get_by_name
def rtnl_link_build_add_request(*args):
return _capi.rtnl_link_build_add_request(*args)
rtnl_link_build_add_request = _capi.rtnl_link_build_add_request
def rtnl_link_add(*args):
return _capi.rtnl_link_add(*args)
rtnl_link_add = _capi.rtnl_link_add
def rtnl_link_build_change_request(*args):
return _capi.rtnl_link_build_change_request(*args)
rtnl_link_build_change_request = _capi.rtnl_link_build_change_request
def rtnl_link_change(*args):
return _capi.rtnl_link_change(*args)
rtnl_link_change = _capi.rtnl_link_change
def rtnl_link_build_delete_request(*args):
return _capi.rtnl_link_build_delete_request(*args)
rtnl_link_build_delete_request = _capi.rtnl_link_build_delete_request
def rtnl_link_delete(*args):
return _capi.rtnl_link_delete(*args)
rtnl_link_delete = _capi.rtnl_link_delete
def rtnl_link_build_get_request(*args):
return _capi.rtnl_link_build_get_request(*args)
rtnl_link_build_get_request = _capi.rtnl_link_build_get_request
def rtnl_link_stat2str(*args):
return _capi.rtnl_link_stat2str(*args)
rtnl_link_stat2str = _capi.rtnl_link_stat2str
def rtnl_link_str2stat(*args):
return _capi.rtnl_link_str2stat(*args)
rtnl_link_str2stat = _capi.rtnl_link_str2stat
def rtnl_link_flags2str(*args):
return _capi.rtnl_link_flags2str(*args)
rtnl_link_flags2str = _capi.rtnl_link_flags2str
def rtnl_link_str2flags(*args):
return _capi.rtnl_link_str2flags(*args)
rtnl_link_str2flags = _capi.rtnl_link_str2flags
def rtnl_link_operstate2str(*args):
return _capi.rtnl_link_operstate2str(*args)
rtnl_link_operstate2str = _capi.rtnl_link_operstate2str
def rtnl_link_str2operstate(*args):
return _capi.rtnl_link_str2operstate(*args)
rtnl_link_str2operstate = _capi.rtnl_link_str2operstate
def rtnl_link_mode2str(*args):
return _capi.rtnl_link_mode2str(*args)
rtnl_link_mode2str = _capi.rtnl_link_mode2str
def rtnl_link_str2mode(*args):
return _capi.rtnl_link_str2mode(*args)
rtnl_link_str2mode = _capi.rtnl_link_str2mode
def rtnl_link_set_qdisc(*args):
return _capi.rtnl_link_set_qdisc(*args)
rtnl_link_set_qdisc = _capi.rtnl_link_set_qdisc
def rtnl_link_get_qdisc(*args):
return _capi.rtnl_link_get_qdisc(*args)
rtnl_link_get_qdisc = _capi.rtnl_link_get_qdisc
def rtnl_link_set_name(*args):
return _capi.rtnl_link_set_name(*args)
rtnl_link_set_name = _capi.rtnl_link_set_name
def rtnl_link_get_name(*args):
return _capi.rtnl_link_get_name(*args)
rtnl_link_get_name = _capi.rtnl_link_get_name
def rtnl_link_set_flags(*args):
return _capi.rtnl_link_set_flags(*args)
rtnl_link_set_flags = _capi.rtnl_link_set_flags
def rtnl_link_unset_flags(*args):
return _capi.rtnl_link_unset_flags(*args)
rtnl_link_unset_flags = _capi.rtnl_link_unset_flags
def rtnl_link_get_flags(*args):
return _capi.rtnl_link_get_flags(*args)
rtnl_link_get_flags = _capi.rtnl_link_get_flags
def rtnl_link_set_mtu(*args):
return _capi.rtnl_link_set_mtu(*args)
rtnl_link_set_mtu = _capi.rtnl_link_set_mtu
def rtnl_link_get_mtu(*args):
return _capi.rtnl_link_get_mtu(*args)
rtnl_link_get_mtu = _capi.rtnl_link_get_mtu
def rtnl_link_set_txqlen(*args):
return _capi.rtnl_link_set_txqlen(*args)
rtnl_link_set_txqlen = _capi.rtnl_link_set_txqlen
def rtnl_link_get_txqlen(*args):
return _capi.rtnl_link_get_txqlen(*args)
rtnl_link_get_txqlen = _capi.rtnl_link_get_txqlen
def rtnl_link_set_weight(*args):
return _capi.rtnl_link_set_weight(*args)
rtnl_link_set_weight = _capi.rtnl_link_set_weight
def rtnl_link_get_weight(*args):
return _capi.rtnl_link_get_weight(*args)
rtnl_link_get_weight = _capi.rtnl_link_get_weight
def rtnl_link_set_ifindex(*args):
return _capi.rtnl_link_set_ifindex(*args)
rtnl_link_set_ifindex = _capi.rtnl_link_set_ifindex
def rtnl_link_get_ifindex(*args):
return _capi.rtnl_link_get_ifindex(*args)
rtnl_link_get_ifindex = _capi.rtnl_link_get_ifindex
def rtnl_link_set_family(*args):
return _capi.rtnl_link_set_family(*args)
rtnl_link_set_family = _capi.rtnl_link_set_family
def rtnl_link_get_family(*args):
return _capi.rtnl_link_get_family(*args)
rtnl_link_get_family = _capi.rtnl_link_get_family
def rtnl_link_set_arptype(*args):
return _capi.rtnl_link_set_arptype(*args)
rtnl_link_set_arptype = _capi.rtnl_link_set_arptype
def rtnl_link_get_arptype(*args):
return _capi.rtnl_link_get_arptype(*args)
rtnl_link_get_arptype = _capi.rtnl_link_get_arptype
def rtnl_link_set_addr(*args):
return _capi.rtnl_link_set_addr(*args)
rtnl_link_set_addr = _capi.rtnl_link_set_addr
def rtnl_link_get_addr(*args):
return _capi.rtnl_link_get_addr(*args)
rtnl_link_get_addr = _capi.rtnl_link_get_addr
def rtnl_link_set_broadcast(*args):
return _capi.rtnl_link_set_broadcast(*args)
rtnl_link_set_broadcast = _capi.rtnl_link_set_broadcast
def rtnl_link_get_broadcast(*args):
return _capi.rtnl_link_get_broadcast(*args)
rtnl_link_get_broadcast = _capi.rtnl_link_get_broadcast
def rtnl_link_set_link(*args):
return _capi.rtnl_link_set_link(*args)
rtnl_link_set_link = _capi.rtnl_link_set_link
def rtnl_link_get_link(*args):
return _capi.rtnl_link_get_link(*args)
rtnl_link_get_link = _capi.rtnl_link_get_link
def rtnl_link_set_master(*args):
return _capi.rtnl_link_set_master(*args)
rtnl_link_set_master = _capi.rtnl_link_set_master
def rtnl_link_get_master(*args):
return _capi.rtnl_link_get_master(*args)
rtnl_link_get_master = _capi.rtnl_link_get_master
def rtnl_link_set_operstate(*args):
return _capi.rtnl_link_set_operstate(*args)
rtnl_link_set_operstate = _capi.rtnl_link_set_operstate
def rtnl_link_get_operstate(*args):
return _capi.rtnl_link_get_operstate(*args)
rtnl_link_get_operstate = _capi.rtnl_link_get_operstate
def rtnl_link_set_linkmode(*args):
return _capi.rtnl_link_set_linkmode(*args)
rtnl_link_set_linkmode = _capi.rtnl_link_set_linkmode
def rtnl_link_get_linkmode(*args):
return _capi.rtnl_link_get_linkmode(*args)
rtnl_link_get_linkmode = _capi.rtnl_link_get_linkmode
def rtnl_link_get_ifalias(*args):
return _capi.rtnl_link_get_ifalias(*args)
rtnl_link_get_ifalias = _capi.rtnl_link_get_ifalias
def rtnl_link_set_ifalias(*args):
return _capi.rtnl_link_set_ifalias(*args)
rtnl_link_set_ifalias = _capi.rtnl_link_set_ifalias
def rtnl_link_get_num_vf(*args):
return _capi.rtnl_link_get_num_vf(*args)
rtnl_link_get_num_vf = _capi.rtnl_link_get_num_vf
def rtnl_link_get_stat(*args):
return _capi.rtnl_link_get_stat(*args)
rtnl_link_get_stat = _capi.rtnl_link_get_stat
def rtnl_link_set_stat(*args):
return _capi.rtnl_link_set_stat(*args)
rtnl_link_set_stat = _capi.rtnl_link_set_stat
def rtnl_link_set_info_type(*args):
return _capi.rtnl_link_set_info_type(*args)
rtnl_link_set_info_type = _capi.rtnl_link_set_info_type
def rtnl_link_get_info_type(*args):
return _capi.rtnl_link_get_info_type(*args)
rtnl_link_get_info_type = _capi.rtnl_link_get_info_type
class vlan_map(object):
thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
__repr__ = _swig_repr
vm_from = _swig_property(_capi.vlan_map_vm_from_get, _capi.vlan_map_vm_from_set)
vm_to = _swig_property(_capi.vlan_map_vm_to_get, _capi.vlan_map_vm_to_set)
__swig_destroy__ = _capi.delete_vlan_map
vlan_map_swigregister = _capi.vlan_map_swigregister
vlan_map_swigregister(vlan_map)
VLAN_PRIO_MAX = _capi.VLAN_PRIO_MAX
def rtnl_link_vlan_flags2str(*args):
return _capi.rtnl_link_vlan_flags2str(*args)
rtnl_link_vlan_flags2str = _capi.rtnl_link_vlan_flags2str
def rtnl_link_vlan_str2flags(*args):
return _capi.rtnl_link_vlan_str2flags(*args)
rtnl_link_vlan_str2flags = _capi.rtnl_link_vlan_str2flags
def rtnl_link_vlan_set_id(*args):
return _capi.rtnl_link_vlan_set_id(*args)
rtnl_link_vlan_set_id = _capi.rtnl_link_vlan_set_id
def rtnl_link_vlan_get_id(*args):
return _capi.rtnl_link_vlan_get_id(*args)
rtnl_link_vlan_get_id = _capi.rtnl_link_vlan_get_id
def rtnl_link_vlan_set_flags(*args):
return _capi.rtnl_link_vlan_set_flags(*args)
rtnl_link_vlan_set_flags = _capi.rtnl_link_vlan_set_flags
def rtnl_link_vlan_unset_flags(*args):
return _capi.rtnl_link_vlan_unset_flags(*args)
rtnl_link_vlan_unset_flags = _capi.rtnl_link_vlan_unset_flags
def rtnl_link_vlan_get_flags(*args):
return _capi.rtnl_link_vlan_get_flags(*args)
rtnl_link_vlan_get_flags = _capi.rtnl_link_vlan_get_flags
def rtnl_link_vlan_set_ingress_map(*args):
return _capi.rtnl_link_vlan_set_ingress_map(*args)
rtnl_link_vlan_set_ingress_map = _capi.rtnl_link_vlan_set_ingress_map
def rtnl_link_vlan_get_ingress_map(*args):
return _capi.rtnl_link_vlan_get_ingress_map(*args)
rtnl_link_vlan_get_ingress_map = _capi.rtnl_link_vlan_get_ingress_map
def rtnl_link_vlan_set_egress_map(*args):
return _capi.rtnl_link_vlan_set_egress_map(*args)
rtnl_link_vlan_set_egress_map = _capi.rtnl_link_vlan_set_egress_map
def rtnl_link_vlan_get_egress_map(*args):
return _capi.rtnl_link_vlan_get_egress_map(*args)
rtnl_link_vlan_get_egress_map = _capi.rtnl_link_vlan_get_egress_map
def rtnl_link_inet_devconf2str(*args):
return _capi.rtnl_link_inet_devconf2str(*args)
rtnl_link_inet_devconf2str = _capi.rtnl_link_inet_devconf2str
def rtnl_link_inet_str2devconf(*args):
return _capi.rtnl_link_inet_str2devconf(*args)
rtnl_link_inet_str2devconf = _capi.rtnl_link_inet_str2devconf
def rtnl_link_inet_set_conf(*args):
return _capi.rtnl_link_inet_set_conf(*args)
rtnl_link_inet_set_conf = _capi.rtnl_link_inet_set_conf
def tc_str2handle(*args):
return _capi.tc_str2handle(*args)
tc_str2handle = _capi.tc_str2handle
def rtnl_tc_set_ifindex(*args):
return _capi.rtnl_tc_set_ifindex(*args)
rtnl_tc_set_ifindex = _capi.rtnl_tc_set_ifindex
def rtnl_tc_get_ifindex(*args):
return _capi.rtnl_tc_get_ifindex(*args)
rtnl_tc_get_ifindex = _capi.rtnl_tc_get_ifindex
def rtnl_tc_set_link(*args):
return _capi.rtnl_tc_set_link(*args)
rtnl_tc_set_link = _capi.rtnl_tc_set_link
def rtnl_tc_get_link(*args):
return _capi.rtnl_tc_get_link(*args)
rtnl_tc_get_link = _capi.rtnl_tc_get_link
def rtnl_tc_set_mtu(*args):
return _capi.rtnl_tc_set_mtu(*args)
rtnl_tc_set_mtu = _capi.rtnl_tc_set_mtu
def rtnl_tc_get_mtu(*args):
return _capi.rtnl_tc_get_mtu(*args)
rtnl_tc_get_mtu = _capi.rtnl_tc_get_mtu
def rtnl_tc_set_mpu(*args):
return _capi.rtnl_tc_set_mpu(*args)
rtnl_tc_set_mpu = _capi.rtnl_tc_set_mpu
def rtnl_tc_get_mpu(*args):
return _capi.rtnl_tc_get_mpu(*args)
rtnl_tc_get_mpu = _capi.rtnl_tc_get_mpu
def rtnl_tc_set_overhead(*args):
return _capi.rtnl_tc_set_overhead(*args)
rtnl_tc_set_overhead = _capi.rtnl_tc_set_overhead
def rtnl_tc_get_overhead(*args):
return _capi.rtnl_tc_get_overhead(*args)
rtnl_tc_get_overhead = _capi.rtnl_tc_get_overhead
def rtnl_tc_set_linktype(*args):
return _capi.rtnl_tc_set_linktype(*args)
rtnl_tc_set_linktype = _capi.rtnl_tc_set_linktype
def rtnl_tc_get_linktype(*args):
return _capi.rtnl_tc_get_linktype(*args)
rtnl_tc_get_linktype = _capi.rtnl_tc_get_linktype
def rtnl_tc_set_handle(*args):
return _capi.rtnl_tc_set_handle(*args)
rtnl_tc_set_handle = _capi.rtnl_tc_set_handle
def rtnl_tc_get_handle(*args):
return _capi.rtnl_tc_get_handle(*args)
rtnl_tc_get_handle = _capi.rtnl_tc_get_handle
def rtnl_tc_set_parent(*args):
return _capi.rtnl_tc_set_parent(*args)
rtnl_tc_set_parent = _capi.rtnl_tc_set_parent
def rtnl_tc_get_parent(*args):
return _capi.rtnl_tc_get_parent(*args)
rtnl_tc_get_parent = _capi.rtnl_tc_get_parent
def rtnl_tc_set_kind(*args):
return _capi.rtnl_tc_set_kind(*args)
rtnl_tc_set_kind = _capi.rtnl_tc_set_kind
def rtnl_tc_get_kind(*args):
return _capi.rtnl_tc_get_kind(*args)
rtnl_tc_get_kind = _capi.rtnl_tc_get_kind
def rtnl_tc_get_stat(*args):
return _capi.rtnl_tc_get_stat(*args)
rtnl_tc_get_stat = _capi.rtnl_tc_get_stat
def rtnl_tc_calc_txtime(*args):
return _capi.rtnl_tc_calc_txtime(*args)
rtnl_tc_calc_txtime = _capi.rtnl_tc_calc_txtime
def rtnl_tc_calc_bufsize(*args):
return _capi.rtnl_tc_calc_bufsize(*args)
rtnl_tc_calc_bufsize = _capi.rtnl_tc_calc_bufsize
def rtnl_tc_calc_cell_log(*args):
return _capi.rtnl_tc_calc_cell_log(*args)
rtnl_tc_calc_cell_log = _capi.rtnl_tc_calc_cell_log
def rtnl_tc_read_classid_file():
return _capi.rtnl_tc_read_classid_file()
rtnl_tc_read_classid_file = _capi.rtnl_tc_read_classid_file
def rtnl_tc_handle2str(*args):
return _capi.rtnl_tc_handle2str(*args)
rtnl_tc_handle2str = _capi.rtnl_tc_handle2str
def rtnl_classid_generate(*args):
return _capi.rtnl_classid_generate(*args)
rtnl_classid_generate = _capi.rtnl_classid_generate
def qdisc2obj(*args):
return _capi.qdisc2obj(*args)
qdisc2obj = _capi.qdisc2obj
def obj2qdisc(*args):
return _capi.obj2qdisc(*args)
obj2qdisc = _capi.obj2qdisc
def class2obj(*args):
return _capi.class2obj(*args)
class2obj = _capi.class2obj
def obj2class(*args):
return _capi.obj2class(*args)
obj2class = _capi.obj2class
def cls2obj(*args):
return _capi.cls2obj(*args)
cls2obj = _capi.cls2obj
def obj2cls(*args):
return _capi.obj2cls(*args)
obj2cls = _capi.obj2cls
def obj2tc(*args):
return _capi.obj2tc(*args)
obj2tc = _capi.obj2tc
def rtnl_qdisc_alloc():
return _capi.rtnl_qdisc_alloc()
rtnl_qdisc_alloc = _capi.rtnl_qdisc_alloc
def rtnl_qdisc_get(*args):
return _capi.rtnl_qdisc_get(*args)
rtnl_qdisc_get = _capi.rtnl_qdisc_get
def rtnl_qdisc_get_by_parent(*args):
return _capi.rtnl_qdisc_get_by_parent(*args)
rtnl_qdisc_get_by_parent = _capi.rtnl_qdisc_get_by_parent
def rtnl_qdisc_build_add_request(*args):
return _capi.rtnl_qdisc_build_add_request(*args)
rtnl_qdisc_build_add_request = _capi.rtnl_qdisc_build_add_request
def rtnl_qdisc_add(*args):
return _capi.rtnl_qdisc_add(*args)
rtnl_qdisc_add = _capi.rtnl_qdisc_add
def rtnl_qdisc_build_update_request(*args):
return _capi.rtnl_qdisc_build_update_request(*args)
rtnl_qdisc_build_update_request = _capi.rtnl_qdisc_build_update_request
def rtnl_qdisc_update(*args):
return _capi.rtnl_qdisc_update(*args)
rtnl_qdisc_update = _capi.rtnl_qdisc_update
def rtnl_qdisc_build_delete_request(*args):
return _capi.rtnl_qdisc_build_delete_request(*args)
rtnl_qdisc_build_delete_request = _capi.rtnl_qdisc_build_delete_request
def rtnl_qdisc_delete(*args):
return _capi.rtnl_qdisc_delete(*args)
rtnl_qdisc_delete = _capi.rtnl_qdisc_delete
def rtnl_cls_alloc():
return _capi.rtnl_cls_alloc()
rtnl_cls_alloc = _capi.rtnl_cls_alloc
def rtnl_cls_put(*args):
return _capi.rtnl_cls_put(*args)
rtnl_cls_put = _capi.rtnl_cls_put
def rtnl_cls_add(*args):
return _capi.rtnl_cls_add(*args)
rtnl_cls_add = _capi.rtnl_cls_add
def rtnl_cls_delete(*args):
return _capi.rtnl_cls_delete(*args)
rtnl_cls_delete = _capi.rtnl_cls_delete
def rtnl_cls_set_prio(*args):
return _capi.rtnl_cls_set_prio(*args)
rtnl_cls_set_prio = _capi.rtnl_cls_set_prio
def rtnl_cls_get_prio(*args):
return _capi.rtnl_cls_get_prio(*args)
rtnl_cls_get_prio = _capi.rtnl_cls_get_prio
def rtnl_cls_set_protocol(*args):
return _capi.rtnl_cls_set_protocol(*args)
rtnl_cls_set_protocol = _capi.rtnl_cls_set_protocol
def rtnl_cls_get_protocol(*args):
return _capi.rtnl_cls_get_protocol(*args)
rtnl_cls_get_protocol = _capi.rtnl_cls_get_protocol
def rtnl_htb_get_rate2quantum(*args):
return _capi.rtnl_htb_get_rate2quantum(*args)
rtnl_htb_get_rate2quantum = _capi.rtnl_htb_get_rate2quantum
def rtnl_htb_set_rate2quantum(*args):
return _capi.rtnl_htb_set_rate2quantum(*args)
rtnl_htb_set_rate2quantum = _capi.rtnl_htb_set_rate2quantum
def rtnl_htb_get_defcls(*args):
return _capi.rtnl_htb_get_defcls(*args)
rtnl_htb_get_defcls = _capi.rtnl_htb_get_defcls
def rtnl_htb_set_defcls(*args):
return _capi.rtnl_htb_set_defcls(*args)
rtnl_htb_set_defcls = _capi.rtnl_htb_set_defcls
def rtnl_htb_get_prio(*args):
return _capi.rtnl_htb_get_prio(*args)
rtnl_htb_get_prio = _capi.rtnl_htb_get_prio
def rtnl_htb_set_prio(*args):
return _capi.rtnl_htb_set_prio(*args)
rtnl_htb_set_prio = _capi.rtnl_htb_set_prio
def rtnl_htb_get_rate(*args):
return _capi.rtnl_htb_get_rate(*args)
rtnl_htb_get_rate = _capi.rtnl_htb_get_rate
def rtnl_htb_set_rate(*args):
return _capi.rtnl_htb_set_rate(*args)
rtnl_htb_set_rate = _capi.rtnl_htb_set_rate
def rtnl_htb_get_ceil(*args):
return _capi.rtnl_htb_get_ceil(*args)
rtnl_htb_get_ceil = _capi.rtnl_htb_get_ceil
def rtnl_htb_set_ceil(*args):
return _capi.rtnl_htb_set_ceil(*args)
rtnl_htb_set_ceil = _capi.rtnl_htb_set_ceil
def rtnl_htb_get_rbuffer(*args):
return _capi.rtnl_htb_get_rbuffer(*args)
rtnl_htb_get_rbuffer = _capi.rtnl_htb_get_rbuffer
def rtnl_htb_set_rbuffer(*args):
return _capi.rtnl_htb_set_rbuffer(*args)
rtnl_htb_set_rbuffer = _capi.rtnl_htb_set_rbuffer
def rtnl_htb_get_cbuffer(*args):
return _capi.rtnl_htb_get_cbuffer(*args)
rtnl_htb_get_cbuffer = _capi.rtnl_htb_get_cbuffer
def rtnl_htb_set_cbuffer(*args):
return _capi.rtnl_htb_set_cbuffer(*args)
rtnl_htb_set_cbuffer = _capi.rtnl_htb_set_cbuffer
def rtnl_htb_get_quantum(*args):
return _capi.rtnl_htb_get_quantum(*args)
rtnl_htb_get_quantum = _capi.rtnl_htb_get_quantum
def rtnl_htb_set_quantum(*args):
return _capi.rtnl_htb_set_quantum(*args)
rtnl_htb_set_quantum = _capi.rtnl_htb_set_quantum
def rtnl_htb_get_level(*args):
return _capi.rtnl_htb_get_level(*args)
rtnl_htb_get_level = _capi.rtnl_htb_get_level
def addr2obj(*args):
return _capi.addr2obj(*args)
addr2obj = _capi.addr2obj
def obj2addr(*args):
return _capi.obj2addr(*args)
obj2addr = _capi.obj2addr
def rtnl_addr_alloc():
return _capi.rtnl_addr_alloc()
rtnl_addr_alloc = _capi.rtnl_addr_alloc
def rtnl_addr_get(*args):
return _capi.rtnl_addr_get(*args)
rtnl_addr_get = _capi.rtnl_addr_get
def rtnl_addr_build_add_request(*args):
return _capi.rtnl_addr_build_add_request(*args)
rtnl_addr_build_add_request = _capi.rtnl_addr_build_add_request
def rtnl_addr_add(*args):
return _capi.rtnl_addr_add(*args)
rtnl_addr_add = _capi.rtnl_addr_add
def rtnl_addr_build_delete_request(*args):
return _capi.rtnl_addr_build_delete_request(*args)
rtnl_addr_build_delete_request = _capi.rtnl_addr_build_delete_request
def rtnl_addr_delete(*args):
return _capi.rtnl_addr_delete(*args)
rtnl_addr_delete = _capi.rtnl_addr_delete
def rtnl_addr_flags2str(*args):
return _capi.rtnl_addr_flags2str(*args)
rtnl_addr_flags2str = _capi.rtnl_addr_flags2str
def rtnl_addr_str2flags(*args):
return _capi.rtnl_addr_str2flags(*args)
rtnl_addr_str2flags = _capi.rtnl_addr_str2flags
def rtnl_addr_set_label(*args):
return _capi.rtnl_addr_set_label(*args)
rtnl_addr_set_label = _capi.rtnl_addr_set_label
def rtnl_addr_get_label(*args):
return _capi.rtnl_addr_get_label(*args)
rtnl_addr_get_label = _capi.rtnl_addr_get_label
def rtnl_addr_set_ifindex(*args):
return _capi.rtnl_addr_set_ifindex(*args)
rtnl_addr_set_ifindex = _capi.rtnl_addr_set_ifindex
def rtnl_addr_get_ifindex(*args):
return _capi.rtnl_addr_get_ifindex(*args)
rtnl_addr_get_ifindex = _capi.rtnl_addr_get_ifindex
def rtnl_addr_set_link(*args):
return _capi.rtnl_addr_set_link(*args)
rtnl_addr_set_link = _capi.rtnl_addr_set_link
def rtnl_addr_get_link(*args):
return _capi.rtnl_addr_get_link(*args)
rtnl_addr_get_link = _capi.rtnl_addr_get_link
def rtnl_addr_set_family(*args):
return _capi.rtnl_addr_set_family(*args)
rtnl_addr_set_family = _capi.rtnl_addr_set_family
def rtnl_addr_get_family(*args):
return _capi.rtnl_addr_get_family(*args)
rtnl_addr_get_family = _capi.rtnl_addr_get_family
def rtnl_addr_set_prefixlen(*args):
return _capi.rtnl_addr_set_prefixlen(*args)
rtnl_addr_set_prefixlen = _capi.rtnl_addr_set_prefixlen
def rtnl_addr_get_prefixlen(*args):
return _capi.rtnl_addr_get_prefixlen(*args)
rtnl_addr_get_prefixlen = _capi.rtnl_addr_get_prefixlen
def rtnl_addr_set_scope(*args):
return _capi.rtnl_addr_set_scope(*args)
rtnl_addr_set_scope = _capi.rtnl_addr_set_scope
def rtnl_addr_get_scope(*args):
return _capi.rtnl_addr_get_scope(*args)
rtnl_addr_get_scope = _capi.rtnl_addr_get_scope
def rtnl_addr_set_flags(*args):
return _capi.rtnl_addr_set_flags(*args)
rtnl_addr_set_flags = _capi.rtnl_addr_set_flags
def rtnl_addr_unset_flags(*args):
return _capi.rtnl_addr_unset_flags(*args)
rtnl_addr_unset_flags = _capi.rtnl_addr_unset_flags
def rtnl_addr_get_flags(*args):
return _capi.rtnl_addr_get_flags(*args)
rtnl_addr_get_flags = _capi.rtnl_addr_get_flags
def rtnl_addr_set_local(*args):
return _capi.rtnl_addr_set_local(*args)
rtnl_addr_set_local = _capi.rtnl_addr_set_local
def rtnl_addr_get_local(*args):
return _capi.rtnl_addr_get_local(*args)
rtnl_addr_get_local = _capi.rtnl_addr_get_local
def rtnl_addr_set_peer(*args):
return _capi.rtnl_addr_set_peer(*args)
rtnl_addr_set_peer = _capi.rtnl_addr_set_peer
def rtnl_addr_get_peer(*args):
return _capi.rtnl_addr_get_peer(*args)
rtnl_addr_get_peer = _capi.rtnl_addr_get_peer
def rtnl_addr_set_broadcast(*args):
return _capi.rtnl_addr_set_broadcast(*args)
rtnl_addr_set_broadcast = _capi.rtnl_addr_set_broadcast
def rtnl_addr_get_broadcast(*args):
return _capi.rtnl_addr_get_broadcast(*args)
rtnl_addr_get_broadcast = _capi.rtnl_addr_get_broadcast
def rtnl_addr_set_multicast(*args):
return _capi.rtnl_addr_set_multicast(*args)
rtnl_addr_set_multicast = _capi.rtnl_addr_set_multicast
def rtnl_addr_get_multicast(*args):
return _capi.rtnl_addr_get_multicast(*args)
rtnl_addr_get_multicast = _capi.rtnl_addr_get_multicast
def rtnl_addr_set_anycast(*args):
return _capi.rtnl_addr_set_anycast(*args)
rtnl_addr_set_anycast = _capi.rtnl_addr_set_anycast
def rtnl_addr_get_anycast(*args):
return _capi.rtnl_addr_get_anycast(*args)
rtnl_addr_get_anycast = _capi.rtnl_addr_get_anycast
def rtnl_addr_get_valid_lifetime(*args):
return _capi.rtnl_addr_get_valid_lifetime(*args)
rtnl_addr_get_valid_lifetime = _capi.rtnl_addr_get_valid_lifetime
def rtnl_addr_set_valid_lifetime(*args):
return _capi.rtnl_addr_set_valid_lifetime(*args)
rtnl_addr_set_valid_lifetime = _capi.rtnl_addr_set_valid_lifetime
def rtnl_addr_get_preferred_lifetime(*args):
return _capi.rtnl_addr_get_preferred_lifetime(*args)
rtnl_addr_get_preferred_lifetime = _capi.rtnl_addr_get_preferred_lifetime
def rtnl_addr_set_preferred_lifetime(*args):
return _capi.rtnl_addr_set_preferred_lifetime(*args)
rtnl_addr_set_preferred_lifetime = _capi.rtnl_addr_set_preferred_lifetime
def rtnl_addr_get_create_time(*args):
return _capi.rtnl_addr_get_create_time(*args)
rtnl_addr_get_create_time = _capi.rtnl_addr_get_create_time
def rtnl_addr_get_last_update_time(*args):
return _capi.rtnl_addr_get_last_update_time(*args)
rtnl_addr_get_last_update_time = _capi.rtnl_addr_get_last_update_time

File diff suppressed because it is too large Load Diff

View File

@ -117,15 +117,16 @@ class LinkCache(netlink.Cache):
if not cache:
cache = self._alloc_cache_name("route/link")
self._info_module = None
self._protocol = netlink.NETLINK_ROUTE
self._c_cache = cache
self._nl_cache = cache
self._set_arg1(family)
def __getitem__(self, key):
if type(key) is int:
link = capi.rtnl_link_get(self._c_cache, key)
link = capi.rtnl_link_get(self._nl_cache, key)
elif type(key) is str:
link = capi.rtnl_link_get_by_name(self._c_cache, key)
link = capi.rtnl_link_get_by_name(self._nl_cache, key)
if link is None:
raise KeyError()
@ -147,10 +148,8 @@ class Link(netlink.Object):
netlink.Object.__init__(self, "route/link", "link", obj)
self._rtnl_link = self._obj2type(self._nl_object)
self._type = None
if self.type:
self._type_lookup(self.type)
self._module_lookup('netlink.route.links.' + self.type)
self.inet = inet.InetLink(self)
self.af = {'inet' : self.inet }
@ -171,15 +170,6 @@ class Link(netlink.Object):
return Link(obj)
def _type_lookup(self, name):
rname = 'netlink.route.links.' + name
tmp = __import__(rname)
mod = sys.modules[rname]
# this will create a type instance and assign it to
# link.<type>, e.g. link.vlan.id
self._type = mod.assign_type(self)
#####################################################################
# ifindex
@netlink.nlattr('link.ifindex', type=int, immutable=True, fmt=util.num)
@ -403,7 +393,7 @@ class Link(netlink.Object):
if capi.rtnl_link_set_info_type(self._rtnl_link, value) < 0:
raise NameError("unknown info type")
self._type_lookup(value)
self._module_lookup('netlink.route.links.' + value)
#####################################################################
# get_stat()
@ -469,14 +459,7 @@ class Link(netlink.Object):
@property
def _brief(self):
buf = ''
if self.type:
if self._type and hasattr(self._type, 'brief'):
buf += self._type.brief()
else:
buf += util.yellow(self.type)
return buf + self._foreach_af('brief')
return self._module_brief() + self._foreach_af('brief')
@property
def _flags(self):
@ -587,10 +570,8 @@ def get(name, socket=None):
return Link.from_capi(link)
link_cache = LinkCache()
_link_cache = LinkCache()
def resolve(name):
socket = netlink.lookup_socket(netlink.NETLINK_ROUTE)
link_cache.refill()
return link_cache[name]
_link_cache.refill()
return _link_cache[name]

View File

@ -7,7 +7,7 @@
"""
__version__ = "1.0"
__all__ = ['assign_type']
__all__ = ['init']
import netlink.core as netlink
import netlink.route.capi as capi
@ -15,7 +15,10 @@ import netlink.route.capi as capi
class DummyLink(object):
def __init__(self, link):
self._rtnl_link = link
def brief(self):
return 'dummy'
def assign_type(link):
def init(link):
link.dummy = DummyLink(link._rtnl_link)
return link.dummy
return link.dummy

View File

@ -57,6 +57,6 @@ class VLANLink(object):
def brief(self):
return 'vlan-id ' + self.id
def assign_type(link):
def init(link):
link.vlan = VLANLink(link._link)
return link.vlan
return link.vlan

View File

@ -1,185 +0,0 @@
#
# Copyright (c) 2011 Thomas Graf <tgraf@suug.ch>
#
__all__ = [
'QdiscCache',
'Qdisc']
import netlink.core as netlink
import netlink.capi as core_capi
import netlink.route.capi as capi
import netlink.util as util
import netlink.route.tc as tc
###########################################################################
# Link Cache
class QdiscCache(netlink.Cache):
"""Cache of qdiscs"""
def __init__(self, cache=None):
if not cache:
cache = self._alloc_cache_name("route/qdisc")
self._protocol = netlink.NETLINK_ROUTE
self._c_cache = cache
# def __getitem__(self, key):
# if type(key) is int:
# link = capi.rtnl_link_get(self._this, key)
# elif type(key) is str:
# link = capi.rtnl_link_get_by_name(self._this, key)
#
# if qdisc is None:
# raise KeyError()
# else:
# return Qdisc._from_capi(capi.qdisc2obj(qdisc))
def _new_object(self, obj):
return Qdisc(obj)
def _new_cache(self, cache):
return QdiscCache(cache=cache)
###########################################################################
# Qdisc Object
class Qdisc(tc.Tc):
"""Network link"""
def __init__(self, obj=None):
self._name = "qdisc"
self._abbr = "qdisc"
netlink.Object.__init__(self, "route/qdisc", "qdisc", obj)
self._tc = capi.obj2tc(self._nl_object)
self._rtnl_qdisc = self._obj2type(self._nl_object)
netlink.attr('qdisc.handle', fmt=util.handle)
netlink.attr('qdisc.parent', fmt=util.handle)
netlink.attr('qdisc.kind', fmt=util.bold)
def _obj2type(self, obj):
return capi.obj2qdisc(obj)
def __cmp__(self, other):
return self.handle - other.handle
def _new_instance(self, obj):
if not obj:
raise ValueError()
return Qdisc(obj)
# #####################################################################
# # add()
# def add(self, socket, flags=None):
# if not flags:
# flags = netlink.NLM_F_CREATE
#
# ret = capi.rtnl_link_add(socket._sock, self._link, flags)
# if ret < 0:
# raise netlink.KernelError(ret)
#
# #####################################################################
# # change()
# def change(self, socket, flags=0):
# """Commit changes made to the link object"""
# if not self._orig:
# raise NetlinkError("Original link not available")
# ret = capi.rtnl_link_change(socket._sock, self._orig, self._link, flags)
# if ret < 0:
# raise netlink.KernelError(ret)
#
# #####################################################################
# # delete()
# def delete(self, socket):
# """Attempt to delete this link in the kernel"""
# ret = capi.rtnl_link_delete(socket._sock, self._link)
# if ret < 0:
# raise netlink.KernelError(ret)
@property
def _dev(self):
buf = util.kw('dev') + ' '
if self.link:
return buf + util.string(self.link.name)
else:
return buf + util.num(self.ifindex)
@property
def _parent(self):
return util.kw('parent') + ' ' + str(self.parent)
###################################################################
#
# format(details=False, stats=False)
#
def format(self, details=False, stats=False):
"""Return qdisc as formatted text"""
fmt = util.MyFormatter(self)
buf = fmt.format('qdisc {kind} {handle} {_dev} {_parent}')
if details:
fmt = util.MyFormatter(self)
buf += fmt.format('\n'\
'\t{mtu} {mpu} {overhead}\n')
# if stats:
# l = [['Packets', RX_PACKETS, TX_PACKETS],
# ['Bytes', RX_BYTES, TX_BYTES],
# ['Errors', RX_ERRORS, TX_ERRORS],
# ['Dropped', RX_DROPPED, TX_DROPPED],
# ['Compressed', RX_COMPRESSED, TX_COMPRESSED],
# ['FIFO Errors', RX_FIFO_ERR, TX_FIFO_ERR],
# ['Length Errors', RX_LEN_ERR, None],
# ['Over Errors', RX_OVER_ERR, None],
# ['CRC Errors', RX_CRC_ERR, None],
# ['Frame Errors', RX_FRAME_ERR, None],
# ['Missed Errors', RX_MISSED_ERR, None],
# ['Abort Errors', None, TX_ABORT_ERR],
# ['Carrier Errors', None, TX_CARRIER_ERR],
# ['Heartbeat Errors', None, TX_HBEAT_ERR],
# ['Window Errors', None, TX_WIN_ERR],
# ['Collisions', None, COLLISIONS],
# ['Multicast', None, MULTICAST],
# ['', None, None],
# ['Ipv6:', None, None],
# ['Packets', IP6_INPKTS, IP6_OUTPKTS],
# ['Bytes', IP6_INOCTETS, IP6_OUTOCTETS],
# ['Discards', IP6_INDISCARDS, IP6_OUTDISCARDS],
# ['Multicast Packets', IP6_INMCASTPKTS, IP6_OUTMCASTPKTS],
# ['Multicast Bytes', IP6_INMCASTOCTETS, IP6_OUTMCASTOCTETS],
# ['Broadcast Packets', IP6_INBCASTPKTS, IP6_OUTBCASTPKTS],
# ['Broadcast Bytes', IP6_INBCASTOCTETS, IP6_OUTBCASTOCTETS],
# ['Delivers', IP6_INDELIVERS, None],
# ['Forwarded', None, IP6_OUTFORWDATAGRAMS],
# ['No Routes', IP6_INNOROUTES, IP6_OUTNOROUTES],
# ['Header Errors', IP6_INHDRERRORS, None],
# ['Too Big Errors', IP6_INTOOBIGERRORS, None],
# ['Address Errors', IP6_INADDRERRORS, None],
# ['Unknown Protocol', IP6_INUNKNOWNPROTOS, None],
# ['Truncated Packets', IP6_INTRUNCATEDPKTS, None],
# ['Reasm Timeouts', IP6_REASMTIMEOUT, None],
# ['Reasm Requests', IP6_REASMREQDS, None],
# ['Reasm Failures', IP6_REASMFAILS, None],
# ['Reasm OK', IP6_REASMOKS, None],
# ['Frag Created', None, IP6_FRAGCREATES],
# ['Frag Failures', None, IP6_FRAGFAILS],
# ['Frag OK', None, IP6_FRAGOKS],
# ['', None, None],
# ['ICMPv6:', None, None],
# ['Messages', ICMP6_INMSGS, ICMP6_OUTMSGS],
# ['Errors', ICMP6_INERRORS, ICMP6_OUTERRORS]]
#
# buf += '\n\t%s%s%s%s\n' % (33 * ' ', util.title('RX'),
# 15 * ' ', util.title('TX'))
#
# for row in l:
# row[0] = util.kw(row[0])
# row[1] = self.get_stat(row[1]) if row[1] else ''
# row[2] = self.get_stat(row[2]) if row[2] else ''
# buf += '\t{0:27} {1:>16} {2:>16}\n'.format(*row)
return buf

View File

View File

@ -0,0 +1,161 @@
#
# Copyright (c) 2011 Thomas Graf <tgraf@suug.ch>
#
"""HTB qdisc
"""
import netlink.core as netlink
import netlink.util as util
import netlink.route.capi as capi
import netlink.route.tc as tc
class HTBQdisc(object):
def __init__(self, qdisc):
self._qdisc = qdisc
###################################################################
# default class
@netlink.nlattr('qdisc.htb.default_class', type=int)
@property
def default_class(self):
return tc.Handle(capi.rtnl_htb_get_defcls(self._qdisc._rtnl_qdisc))
@default_class.setter
def default_class(self, value):
capi.rtnl_htb_set_defcls(self._qdisc._rtnl_qdisc, int(value))
#####################################################################
# r2q
@netlink.nlattr('qdisc.htb.r2q', type=int)
@property
def r2q(self):
return capi.rtnl_htb_get_rate2quantum(self._qdisc._rtnl_qdisc)
@r2q.setter
def r2q(self, value):
capi.rtnl_htb_get_rate2quantum(self._qdisc._rtnl_qdisc,
int(value))
def brief(self):
fmt = util.MyFormatter(self)
ret = ' {s|default-class!k} {a|default_class}'
if self.r2q:
ret += ' {s|r2q!k} {a|r2q}'
return fmt.format(ret)
class HTBClass(object):
def __init__(self, cl):
self._class = cl
#####################################################################
# rate
@netlink.nlattr('class.htb.rate', type=str)
@property
def rate(self):
rate = capi.rtnl_htb_get_rate(self._class._rtnl_class)
return util.Rate(rate)
@rate.setter
def rate(self, value):
capi.rtnl_htb_set_rate(self._class._rtnl_class, int(value))
#####################################################################
# ceil
@netlink.nlattr('class.htb.ceil', type=str)
@property
def ceil(self):
ceil = capi.rtnl_htb_get_ceil(self._class._rtnl_class)
return util.Rate(ceil)
@ceil.setter
def ceil(self, value):
capi.rtnl_htb_set_ceil(self._class._rtnl_class, int(value))
#####################################################################
# burst
@netlink.nlattr('class.htb.burst', type=str)
@property
def burst(self):
burst = capi.rtnl_htb_get_rbuffer(self._class._rtnl_class)
return util.Size(burst)
@burst.setter
def burst(self, value):
capi.rtnl_htb_set_rbuffer(self._class._rtnl_class, int(value))
#####################################################################
# ceil burst
@netlink.nlattr('class.htb.ceil_burst', type=str)
@property
def ceil_burst(self):
burst = capi.rtnl_htb_get_cbuffer(self._class._rtnl_class)
return util.Size(burst)
@ceil_burst.setter
def ceil_burst(self, value):
capi.rtnl_htb_set_cbuffer(self._class._rtnl_class, int(value))
#####################################################################
# priority
@netlink.nlattr('class.htb.prio', type=int)
@property
def prio(self):
return capi.rtnl_htb_get_prio(self._class._rtnl_class)
@prio.setter
def prio(self, value):
capi.rtnl_htb_set_prio(self._class._rtnl_class, int(value))
#####################################################################
# quantum
@netlink.nlattr('class.htb.quantum', type=int)
@property
def quantum(self):
return capi.rtnl_htb_get_quantum(self._class._rtnl_class)
@quantum.setter
def quantum(self, value):
capi.rtnl_htb_set_quantum(self._class._rtnl_class, int(value))
#####################################################################
# level
@netlink.nlattr('class.htb.level', type=int)
@property
def level(self):
level = capi.rtnl_htb_get_level(self._class._rtnl_class)
@level.setter
def level(self, value):
capi.rtnl_htb_set_level(self._class._rtnl_class, int(value))
def brief(self):
fmt = util.MyFormatter(self)
ret = ' {t|prio} {t|rate}'
if self.rate != self.ceil:
ret += ' {s|borrow-up-to!k} {a|ceil}'
ret += ' {t|burst}'
return fmt.format(ret)
def details(self):
fmt = util.MyFormatter(self)
return fmt.nl('\t{t|level} {t|quantum}')
def init_qdisc(qdisc):
qdisc.htb = HTBQdisc(qdisc)
return qdisc.htb
def init_class(cl):
cl.htb = HTBClass(cl)
return cl.htb
#extern void rtnl_htb_set_quantum(struct rtnl_class *, uint32_t quantum);

View File

@ -1,5 +1,3 @@
#
# Copyright (c) 2011 Thomas Graf <tgraf@suug.ch>
#
@ -8,7 +6,9 @@ __all__ = [
'TcCache',
'Tc',
'QdiscCache',
'Qdisc']
'Qdisc',
'TcClassCache',
'TcClass']
import socket
import sys
@ -17,7 +17,7 @@ import netlink.capi as core_capi
import netlink.route.capi as capi
import netlink.util as util
from netlink.route.link import Link
import netlink.route.link as Link
TC_PACKETS = 0
TC_BYTES = 1
@ -32,7 +32,31 @@ TC_OVERLIMITS = 9
TC_H_ROOT = 0xFFFFFFFF
TC_H_INGRESS = 0xFFFFFFF1
STAT_PACKETS = 0
STAT_BYTES = 1
STAT_RATE_BPS = 2
STAT_RATE_PPS = 3
STAT_QLEN = 4
STAT_BACKLOG = 5
STAT_DROPS = 6
STAT_REQUEUES = 7
STAT_OVERLIMITS = 8
STAT_MAX = STAT_OVERLIMITS
###########################################################################
# Handle
class Handle(object):
""" Traffic control handle
Representation of a traffic control handle which uniquely identifies
each traffic control object in its link namespace.
handle = tc.Handle('10:20')
handle = tc.handle('root')
print int(handle)
print str(handle)
"""
def __init__(self, val=None):
if type(val) is str:
val = capi.tc_str2handle(val)
@ -41,6 +65,17 @@ class Handle(object):
self._val = int(val)
def __cmp__(self, other):
if other is None:
other = 0
if isinstance(other, Handle):
return int(self) - int(other)
elif isinstance(other, int):
return int(self) - other
else:
raise TypeError()
def __int__(self):
return self._val
@ -62,9 +97,18 @@ class TcCache(netlink.Cache):
# Tc Object
class Tc(netlink.Object):
def __cmp__(self, other):
return self.ifindex - other.ifindex
diff = self.ifindex - other.ifindex
if diff == 0:
diff = int(self.handle) - int(other.handle)
return diff
def isroot(self):
def _tc_module_lookup(self):
self._module_lookup(self._module_path + self.kind,
'init_' + self._name)
@property
def root(self):
"""True if tc object is a root object"""
return self.parent.isroot()
#####################################################################
@ -72,120 +116,140 @@ class Tc(netlink.Object):
@property
def ifindex(self):
"""interface index"""
return capi.rtnl_tc_get_ifindex(self._tc)
return capi.rtnl_tc_get_ifindex(self._rtnl_tc)
@ifindex.setter
def ifindex(self, value):
capi.rtnl_tc_set_ifindex(self._tc, int(value))
capi.rtnl_tc_set_ifindex(self._rtnl_tc, int(value))
#####################################################################
# link
@property
def link(self):
link = capi.rtnl_tc_get_link(self._tc)
link = capi.rtnl_tc_get_link(self._rtnl_tc)
if not link:
return None
else:
return Link._from_capi(link)
return Link.Link.from_capi(link)
@link.setter
def link(self, value):
capi.rtnl_tc_set_link(self._tc, value._link)
capi.rtnl_tc_set_link(self._rtnl_tc, value._link)
#####################################################################
# mtu
@property
def mtu(self):
return capi.rtnl_tc_get_mtu(self._tc)
return capi.rtnl_tc_get_mtu(self._rtnl_tc)
@mtu.setter
def mtu(self, value):
capi.rtnl_tc_set_mtu(self._tc, int(value))
capi.rtnl_tc_set_mtu(self._rtnl_tc, int(value))
#####################################################################
# mpu
@property
def mpu(self):
return capi.rtnl_tc_get_mpu(self._tc)
return capi.rtnl_tc_get_mpu(self._rtnl_tc)
@mpu.setter
def mpu(self, value):
capi.rtnl_tc_set_mpu(self._tc, int(value))
capi.rtnl_tc_set_mpu(self._rtnl_tc, int(value))
#####################################################################
# overhead
@property
def overhead(self):
return capi.rtnl_tc_get_overhead(self._tc)
return capi.rtnl_tc_get_overhead(self._rtnl_tc)
@overhead.setter
def overhead(self, value):
capi.rtnl_tc_set_overhead(self._tc, int(value))
capi.rtnl_tc_set_overhead(self._rtnl_tc, int(value))
#####################################################################
# linktype
@property
def linktype(self):
return capi.rtnl_tc_get_linktype(self._tc)
return capi.rtnl_tc_get_linktype(self._rtnl_tc)
@linktype.setter
def linktype(self, value):
capi.rtnl_tc_set_linktype(self._tc, int(value))
capi.rtnl_tc_set_linktype(self._rtnl_tc, int(value))
#####################################################################
# handle
@property
def handle(self):
return Handle(capi.rtnl_tc_get_handle(self._tc))
return Handle(capi.rtnl_tc_get_handle(self._rtnl_tc))
@handle.setter
def handle(self, value):
capi.rtnl_tc_set_handle(self._tc, int(value))
capi.rtnl_tc_set_handle(self._rtnl_tc, int(value))
#####################################################################
# parent
@property
def parent(self):
return Handle(capi.rtnl_tc_get_parent(self._tc))
return Handle(capi.rtnl_tc_get_parent(self._rtnl_tc))
@parent.setter
def parent(self, value):
capi.rtnl_tc_set_parent(self._tc, int(value))
capi.rtnl_tc_set_parent(self._rtnl_tc, int(value))
#####################################################################
# kind
@property
def kind(self):
return capi.rtnl_tc_get_kind(self._tc)
return capi.rtnl_tc_get_kind(self._rtnl_tc)
@kind.setter
def kind(self, value):
capi.rtnl_tc_set_kind(self._tc, value)
capi.rtnl_tc_set_kind(self._rtnl_tc, value)
self._tc_module_lookup()
def get_stat(self, id):
return capi.rtnl_tc_get_stat(self._tc, id)
return capi.rtnl_tc_get_stat(self._rtnl_tc, id)
class TcTree(object):
def __init__(self, link, sock):
self._qdisc_cache = QdiscCache().refill(sock)
@property
def _dev(self):
buf = util.kw('dev') + ' '
def __getitem__(self, key):
pass
# if type(key) is int:
# link = capi.rtnl_link_get(self._this, key)
# elif type(key) is str:
# link = capi.rtnl_link_get_by_name(self._this, key)
#
# if qdisc is None:
# raise KeyError()
# else:
# return Qdisc._from_capi(capi.qdisc2obj(qdisc))
if self.link:
return buf + util.string(self.link.name)
else:
return buf + util.num(self.ifindex)
def brief(self, title, nodev=False, noparent=False):
ret = title + ' {a|kind} {a|handle}'
if not nodev:
ret += ' {a|_dev}'
if not noparent:
ret += ' {t|parent}'
return ret + self._module_brief()
def details(self):
return '{t|mtu} {t|mpu} {t|overhead} {t|linktype}'
@property
def packets(self):
return self.get_stat(STAT_PACKETS)
@property
def bytes(self):
return self.get_stat(STAT_BYTES)
@property
def qlen(self):
return self.get_stat(STAT_QLEN)
def stats(self, fmt):
return fmt.nl('{t|packets} {t|bytes} {t|qlen}')
###########################################################################
# Link Cache
# Queueing discipline cache
class QdiscCache(netlink.Cache):
"""Cache of qdiscs"""
@ -193,7 +257,8 @@ class QdiscCache(netlink.Cache):
if not cache:
cache = self._alloc_cache_name("route/qdisc")
self._c_cache = cache
self._protocol = netlink.NETLINK_ROUTE
self._nl_cache = cache
# def __getitem__(self, key):
# if type(key) is int:
@ -215,33 +280,48 @@ class QdiscCache(netlink.Cache):
###########################################################################
# Qdisc Object
class Qdisc(Tc):
"""Network link"""
"""Queueing discipline"""
def __init__(self, obj=None):
self._name = "qdisc"
self._abbr = "qdisc"
netlink.Object.__init__(self, "route/qdisc", "qdisc", obj)
self._module_path = 'netlink.route.qdisc.'
self._rtnl_qdisc = self._obj2type(self._nl_object)
self._rtnl_tc = capi.obj2tc(self._nl_object)
if not obj:
self._qdisc = capi.rtnl_qdisc_alloc()
else:
self._qdisc = capi.obj2qdisc(obj)
netlink.add_attr('qdisc.handle', fmt=util.handle)
netlink.add_attr('qdisc.parent', fmt=util.handle)
netlink.add_attr('qdisc.kind', fmt=util.bold)
self._obj = capi.qdisc2obj(self._qdisc)
self._orig = capi.obj2qdisc(core_capi.nl_object_clone(self._obj))
if self.kind:
self._tc_module_lookup()
Tc.__init__(self)
@classmethod
def from_capi(cls, obj):
return cls(capi.qdisc2obj(obj))
netlink.attr('qdisc.handle', fmt=util.handle)
netlink.attr('qdisc.parent', fmt=util.handle)
netlink.attr('qdisc.kind', fmt=util.bold)
def __cmp__(self, other):
return self.handle - other.handle
def _obj2type(self, obj):
return capi.obj2qdisc(obj)
def _new_instance(self, obj):
if not obj: raise ValueError()
if not obj:
raise ValueError()
return Qdisc(obj)
@property
def childs(self):
ret = []
if int(self.handle):
ret += get_cls(self.ifindex, parent=self.handle)
if self.root:
ret += get_class(self.ifindex, parent=TC_H_ROOT)
ret += get_class(self.ifindex, parent=self.handle)
return ret
# #####################################################################
# # add()
# def add(self, socket, flags=None):
@ -270,33 +350,22 @@ class Qdisc(Tc):
# if ret < 0:
# raise netlink.KernelError(ret)
@property
def _dev(self):
buf = util.kw('dev') + ' '
if self.link:
return buf + util.string(self.link.name)
else:
return buf + util.num(self.ifindex)
@property
def _parent(self):
return util.kw('parent') + ' ' + str(self.parent)
###################################################################
#
# format(details=False, stats=False)
#
def format(self, details=False, stats=False):
def format(self, details=False, stats=False, nodev=False,
noparent=False, indent=''):
"""Return qdisc as formatted text"""
fmt = util.BriefFormatter(self)
buf = fmt.format('qdisc {kind} {handle} {_dev} {_parent}')
fmt = util.MyFormatter(self, indent)
buf = fmt.format(self.brief('qdisc', nodev, noparent))
if details:
fmt = util.DetailFormatter(self)
buf += fmt.format('\n'\
'\t{mtu} {mpu} {overhead}\n')
buf += fmt.nl('\t' + self.details())
if stats:
buf += self.stats(fmt)
# if stats:
# l = [['Packets', RX_PACKETS, TX_PACKETS],
@ -355,3 +424,229 @@ class Qdisc(Tc):
# buf += '\t{0:27} {1:>16} {2:>16}\n'.format(*row)
return buf
###########################################################################
# Traffic class cache
class TcClassCache(netlink.Cache):
"""Cache of traffic classes"""
def __init__(self, ifindex, cache=None):
if not cache:
cache = self._alloc_cache_name("route/class")
self._protocol = netlink.NETLINK_ROUTE
self._nl_cache = cache
self._set_arg1(ifindex)
def _new_object(self, obj):
return TcClass(obj)
def _new_cache(self, cache):
return TcClassCache(self.arg1, cache=cache)
###########################################################################
# Traffic Class Object
class TcClass(Tc):
"""Traffic Class"""
def __init__(self, obj=None):
netlink.Object.__init__(self, "route/class", "class", obj)
self._module_path = 'netlink.route.qdisc.'
self._rtnl_class = self._obj2type(self._nl_object)
self._rtnl_tc = capi.obj2tc(self._nl_object)
netlink.add_attr('class.handle', fmt=util.handle)
netlink.add_attr('class.parent', fmt=util.handle)
netlink.add_attr('class.kind', fmt=util.bold)
if self.kind:
self._tc_module_lookup()
@classmethod
def from_capi(cls, obj):
return cls(capi.class2obj(obj))
def _obj2type(self, obj):
return capi.obj2class(obj)
def _new_instance(self, obj):
if not obj:
raise ValueError()
return TcClass(obj)
@property
def childs(self):
ret = []
# classes can have classifiers, child classes and leaf
# qdiscs
ret += get_cls(self.ifindex, parent=self.handle)
ret += get_class(self.ifindex, parent=self.handle)
ret += get_qdisc(self.ifindex, parent=self.handle)
return ret
###################################################################
#
# format(details=False, stats=False)
#
def format(self, details=False, stats=False, nodev=False,
noparent=False, indent=''):
"""Return class as formatted text"""
fmt = util.MyFormatter(self, indent)
buf = fmt.format(self.brief('class', nodev, noparent))
if details:
buf += fmt.nl('\t' + self.details())
return buf
###########################################################################
# Classifier Cache
class ClassifierCache(netlink.Cache):
"""Cache of traffic classifiers objects"""
def __init__(self, ifindex, parent, cache=None):
if not cache:
cache = self._alloc_cache_name("route/cls")
self._protocol = netlink.NETLINK_ROUTE
self._nl_cache = cache
self._set_arg1(ifindex)
self._set_arg2(int(parent))
def _new_object(self, obj):
return Classifier(obj)
def _new_cache(self, cache):
return ClassifierCache(self.arg1, self.arg2, cache=cache)
###########################################################################
# Classifier Object
class Classifier(Tc):
"""Classifier"""
def __init__(self, obj=None):
netlink.Object.__init__(self, "route/cls", "cls", obj)
self._module_path = 'netlink.route.cls.'
self._rtnl_cls = self._obj2type(self._nl_object)
self._rtnl_tc = capi.obj2tc(self._nl_object)
netlink.add_attr('cls.handle', fmt=util.handle)
netlink.add_attr('cls.parent', fmt=util.handle)
netlink.add_attr('cls.kind', fmt=util.bold)
@classmethod
def from_capi(cls, obj):
return cls(capi.cls2obj(obj))
def _obj2type(self, obj):
return capi.obj2cls(obj)
def _new_instance(self, obj):
if not obj:
raise ValueError()
return Classifier(obj)
#####################################################################
# priority
@property
def priority(self):
return capi.rtnl_cls_get_prio(self._rtnl_cls)
@priority.setter
def priority(self, value):
capi.rtnl_cls_set_prio(self._rtnl_cls, int(value))
#####################################################################
# protocol
@property
def protocol(self):
return capi.rtnl_cls_get_protocol(self._rtnl_cls)
@protocol.setter
def protocol(self, value):
capi.rtnl_cls_set_protocol(self._rtnl_cls, int(value))
@property
def childs(self):
return []
###################################################################
#
# format(details=False, stats=False)
#
def format(self, details=False, stats=False, nodev=False,
noparent=False, indent=''):
"""Return class as formatted text"""
fmt = util.MyFormatter(self, indent)
buf = fmt.format(self.brief('classifier', nodev, noparent))
buf += fmt.format(' {t|priority} {t|protocol}')
if details:
buf += fmt.nl('\t' + self.details())
return buf
_qdisc_cache = QdiscCache()
def get_qdisc(ifindex, handle=None, parent=None):
l = []
_qdisc_cache.refill()
for qdisc in _qdisc_cache:
if qdisc.ifindex == ifindex and \
(handle == None or qdisc.handle == handle) and \
(parent == None or qdisc.parent == parent):
l.append(qdisc)
return l
_class_cache = {}
def get_class(ifindex, parent, handle=None):
l = []
try:
cache = _class_cache[ifindex]
except KeyError:
cache = TcClassCache(ifindex)
_class_cache[ifindex] = cache
cache.refill()
for cl in cache:
if (parent == None or cl.parent == parent) and \
(handle == None or cl.handle == handle):
l.append(cl)
return l
_cls_cache = {}
def get_cls(ifindex, parent, handle=None):
l = []
try:
chain = _cls_cache[ifindex]
except KeyError:
_cls_cache[ifindex] = {}
try:
cache = _cls_cache[ifindex][parent]
except KeyError:
cache = ClassifierCache(ifindex, parent)
_cls_cache[ifindex][parent] = cache
cache.refill()
for cls in cache:
if handle == None or cls.handle == handle:
l.append(cls)
return l

View File

@ -9,6 +9,7 @@
"""
import netlink.core as netlink
import netlink.capi as capi
from string import Formatter
__version__ = "1.0"
@ -92,6 +93,8 @@ class MyFormatter(Formatter):
title = d['title']
except KeyError:
pass
except AttributeError:
pass
return title, str(value)
@ -144,3 +147,33 @@ class MyFormatter(Formatter):
def nl(self, format_string=''):
return '\n' + self._indent + self.format(format_string)
NL_BYTE_RATE = 0
NL_BIT_RATE = 1
class Rate(object):
def __init__(self, rate, mode=NL_BYTE_RATE):
self._rate = rate
self._mode = mode
def __str__(self):
return capi.nl_rate2str(self._rate, self._mode, 32)[1]
def __int__(self):
return self._rate
def __cmp__(self, other):
return int(self) - int(other)
class Size(object):
def __init__(self, size):
self._size = size
def __str__(self):
return capi.nl_size2str(self._size, 32)[0]
def __int__(self):
return self._size
def __cmp__(self, other):
return int(self) - int(other)

View File

@ -25,5 +25,6 @@ setup(name = 'netlink',
author = 'Thomas Graf',
author_email = 'tgraf@suug.ch',
ext_modules = [netlink_capi, route_capi],
packages = ['netlink', 'netlink.route', 'netlink.route.links'],
packages = ['netlink', 'netlink.route', 'netlink.route.links',
'netlink.route.qdisc'],
)