diff -pruN 0.4.21-0.1/CHANGELOG.md 0.5.2-1/CHANGELOG.md --- 0.4.21-0.1/CHANGELOG.md 2017-09-01 19:18:23.000000000 +0000 +++ 0.5.2-1/CHANGELOG.md 2018-06-19 08:21:34.000000000 +0000 @@ -1,19 +1,39 @@ -changelog +Changelog ========= -* 0.4.21 - * ipdb: #416 -- workaround for the vrf_table issue -* 0.4.20 - * ipdb: #392 -- fix MPLS route key reference - * ipdb: #408 -- fix IPv6 routes in tables >= 256 - * ipdb: use tos as a route key -* 0.4.19 - * ipdb: global methods `review()`, `drop()`, `dump()`, `load()` - * ipdb: support VLAN protocol (802.1q, 802.1ad) - * ipdb: initial support for IPv6 rules +* 0.5.2 + * ndb: read-only DB prototype + * remote: support communication via stdio + * general: fix async keyword -- Python 3.7 compatibility + * + * + * iproute: support monitoring on BSD systems via PF_ROUTE + * rtnl: support for SQL schema in message classes + * nl80211: improvements + * + * + * + * netlink: support generators +* 0.5.1 + * ipdb: #310 -- route keying fix + * ipdb: #483, #484 -- callback internals change + * ipdb: #499 -- eventloop interface + * ipdb: #500 -- fix non-default :: routes + * netns: #448 -- API change: setns() doesn't remove FD + * netns: #504 -- fix resource leakage + * bsd: initial commits +* 0.5.0 + * ACHTUNG: ipdb commit logic is changed + * ipdb: do not drop failed transactions * ipdb: #388 -- normalize IPv6 addresses * ipdb: #391 -- support both IPv4 and IPv6 default routes + * ipdb: #392 -- fix MPLS route key reference * ipdb: #394 -- correctly work with route priorities + * ipdb: #408 -- fix IPv6 routes in tables >= 256 + * ipdb: #416 -- fix VRF interfaces creation + * ipset: multiple improvements + * tuntap: #469 -- support s390x arch + * nlsocket: #443 -- fix socket methods resolve order for Python2 * netns: non-destructive `netns.create()` * 0.4.18 * ipdb: #379 [critical] -- routes in global commits diff -pruN 0.4.21-0.1/debian/changelog 0.5.2-1/debian/changelog --- 0.4.21-0.1/debian/changelog 2017-10-16 19:00:49.000000000 +0000 +++ 0.5.2-1/debian/changelog 2018-07-10 21:32:31.000000000 +0000 @@ -1,9 +1,19 @@ -pyroute2 (0.4.21-0.1) unstable; urgency=medium +pyroute2 (0.5.2-1) unstable; urgency=medium - * Non-maintainer upload. - * New upstream release. + [ Michal Arbet ] + * New upstream version (Closes: #903394) + * Add nose tests + * Use Debian package jQuery + * Fix build-depends-on-python-sphinx-only + * Adding d/source.lintian-overrides + + [ Florian Pelgrim ] + * Changed copyright format uri to https + * Removed trailing spaces from d/control and d/changelog + * Increased debhelper compat to 11 + * Update lintian override location to d/source/lintian-overrides - -- Thomas Goirand Mon, 16 Oct 2017 19:00:49 +0000 + -- Florian Pelgrim Tue, 10 Jul 2018 21:32:31 +0000 pyroute2 (0.4.12-2) unstable; urgency=medium @@ -41,7 +51,7 @@ pyroute2 (0.3.5-2) unstable; urgency=med pyroute2 (0.3.5-1) unstable; urgency=medium - * Update package to 0.3.5 + * Update package to 0.3.5 -- Florian Pelgrim Thu, 26 Mar 2015 08:33:10 -0500 diff -pruN 0.4.21-0.1/debian/compat 0.5.2-1/debian/compat --- 0.4.21-0.1/debian/compat 2017-10-16 19:00:49.000000000 +0000 +++ 0.5.2-1/debian/compat 2018-07-10 21:24:34.000000000 +0000 @@ -1 +1 @@ -10 +11 diff -pruN 0.4.21-0.1/debian/control 0.5.2-1/debian/control --- 0.4.21-0.1/debian/control 2017-10-16 19:00:49.000000000 +0000 +++ 0.5.2-1/debian/control 2018-07-10 21:24:34.000000000 +0000 @@ -2,14 +2,17 @@ Source: pyroute2 Maintainer: Florian Pelgrim Section: python Priority: optional -Build-Depends: debhelper (>= 10~) +Build-Depends: debhelper (>= 11~) Build-Depends-Indep: dh-python, python-all, python-doc, python-sphinx, + python-nose, + python3-sphinx, + python3-nose, python3-all -Standards-Version: 3.9.8 +Standards-Version: 4.1.5 Homepage: https://pypi.python.org/pypi/pyroute2 VCS-Browser: https://github.com/craneworks/python-pyroute2 VCS-Git: https://github.com/craneworks/python-pyroute2.git @@ -26,7 +29,7 @@ Description: Python Netlink library Later it can change, but the deps tree will remain as simple, as it is possible. . - This is the Python 2 compatible package. + This is the Python 2 compatible package. Package: python3-pyroute2 Architecture: all @@ -45,7 +48,10 @@ Description: Python3 Netlink library Package: python-pyroute2-doc Architecture: all Section: doc -Depends: ${misc:Depends} +Depends: + libjs-underscore, + libjs-jquery, + ${misc:Depends} Description: netlink and Linux network configuration library (documentation) Pyroute2 is a pure Python netlink and Linux network configuration library. It requires only Python stdlib, no 3rd party libraries. diff -pruN 0.4.21-0.1/debian/copyright 0.5.2-1/debian/copyright --- 0.4.21-0.1/debian/copyright 2017-10-16 19:00:49.000000000 +0000 +++ 0.5.2-1/debian/copyright 2018-07-10 21:24:34.000000000 +0000 @@ -1,4 +1,4 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: pyroute2 Upstream-Contact: Peter V. Saveliev Source: https://pypi.python.org/pypi/pyroute2 diff -pruN 0.4.21-0.1/debian/python-pyroute2-doc.doc-base 0.5.2-1/debian/python-pyroute2-doc.doc-base --- 0.4.21-0.1/debian/python-pyroute2-doc.doc-base 2017-10-16 19:00:49.000000000 +0000 +++ 0.5.2-1/debian/python-pyroute2-doc.doc-base 2018-07-10 21:24:34.000000000 +0000 @@ -4,5 +4,5 @@ Author: Peter V. Saveliev Section: Programming/Python Format: HTML -Index: /usr/share/doc/python-pyroute2-doc/html/index.html -Files: /usr/share/doc/python-pyroute2-doc/html +Index: /usr/share/doc/python-pyroute2/html/index.html +Files: /usr/share/doc/python-pyroute2/html diff -pruN 0.4.21-0.1/debian/python-pyroute2-doc.links 0.5.2-1/debian/python-pyroute2-doc.links --- 0.4.21-0.1/debian/python-pyroute2-doc.links 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/debian/python-pyroute2-doc.links 2018-07-10 21:32:31.000000000 +0000 @@ -0,0 +1,3 @@ +usr/share/javascript/jquery/jquery.js usr/share/doc/python-pyroute2/html/_static/jquery-3.2.1.js +usr/share/javascript/jquery/jquery.min.js usr/share/doc/python-pyroute2/html/_static/jquery.js +usr/share/javascript/underscore/underscore.min.js usr/share/doc/python-pyroute2/html/_static/underscore.js diff -pruN 0.4.21-0.1/debian/rules 0.5.2-1/debian/rules --- 0.4.21-0.1/debian/rules 2017-10-16 19:00:49.000000000 +0000 +++ 0.5.2-1/debian/rules 2018-07-10 21:24:34.000000000 +0000 @@ -1,6 +1,11 @@ #!/usr/bin/make -f export PYBUILD_NAME=pyroute2 +export PYBUILD_BEFORE_TEST=cp -r {dir}/tests {build_dir}/ +export PYBUILD_AFTER_TEST=rm -rf {build_dir}/tests +export PYBUILD_TEST_ARGS=tests/unit +export PYBUILD_TEST_NOSE=1 + %: dh $@ --with python2,python3 --buildsystem=pybuild diff -pruN 0.4.21-0.1/debian/source/lintian-overrides 0.5.2-1/debian/source/lintian-overrides --- 0.4.21-0.1/debian/source/lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/debian/source/lintian-overrides 2018-07-10 21:24:34.000000000 +0000 @@ -0,0 +1,2 @@ +# This is a false positive: +pyroute2 source: source-is-missing diff -pruN 0.4.21-0.1/docs/html/arch.html 0.5.2-1/docs/html/arch.html --- 0.4.21-0.1/docs/html/arch.html 2017-09-01 19:37:24.000000000 +0000 +++ 0.5.2-1/docs/html/arch.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - Module architecture — pyroute2 0.4.21 documentation - + Module architecture — pyroute2 0.5.2 documentation - - + + @@ -28,10 +18,9 @@ - - + + + +
@@ -71,25 +62,23 @@ with fileno(), recv() can use it in poll().

There is an inheritance diagram of netlink sockets, provided by the library:

-Inheritance diagram of pyroute2.iproute.IPRoute, pyroute2.iproute.IPBatch, pyroute2.iproute.RawIPRoute, pyroute2.iwutil.IW, pyroute2.ipset.IPSet, pyroute2.netlink.taskstats.TaskStats, pyroute2.netlink.ipq.IPQSocket, pyroute2.remote.Client, pyroute2.remote.RemoteSocket, pyroute2.remote.Remote, pyroute2.netns.nslink.NetNS - - - - - - - - - - - - - -
+Inheritance diagram of pyroute2.iproute.linux.IPRoute, pyroute2.iproute.linux.IPBatch, pyroute2.iproute.linux.RawIPRoute, pyroute2.iwutil.IW, pyroute2.ipset.IPSet, pyroute2.netlink.taskstats.TaskStats, pyroute2.netlink.ipq.IPQSocket, pyroute2.remote.Client, pyroute2.remote.RemoteSocket, pyroute2.remote.shell.ShellIPR, pyroute2.netns.nslink.NetNS + + + + + + + + + + + +

under the hood

-

Let’s assume we use an IPRoute object to get the +

Let’s assume we use an IPRoute object to get the interface list of the system:

-
from pyroute2 import IPRoute
+
from pyroute2 import IPRoute
 ipr = IPRoute()
 ipr.get_links()
 ipr.close()
@@ -98,14 +87,14 @@ interface list of the system:

The get_links() method is provided by the IPRouteMixin class. It chooses the message to send (ifinfmsg), prepares required fields and passes it to the next layer:

-
result.extend(self.nlm_request(msg, RTM_GETLINK, msg_flags))
+
result.extend(self.nlm_request(msg, RTM_GETLINK, msg_flags))
 

The nlm_request() is a method of the NetlinkMixin class. It wraps the pair request/response in one method. The request is done via put(), response comes with get(). These methods hide under the hood the asynchronous nature of the -netlink protocol, where the response can come whenever – +netlink protocol, where the response can come whenever – the time and packet order are not guaranteed. But one can use the sequence_number field of a netlink message to match responses, and the pair put()/get() does it.

@@ -116,13 +105,13 @@ match responses, and the pair put( and parse them only when there is time for that. For that case the NetlinkMixin provides a possibility to start a dedicated cache thread, that will collect and queue incoming -messages as they arrive. The thread doesn’t affect the +messages as they arrive. The thread doesn’t affect the socket behaviour: it will behave exactly in the same way, the only difference is that recv() will return already cached in the userspace message. To start the thread, -one should call bind() with async=True:

-
ipr = IPRoute()
-ipr.bind(async=True)
+one should call bind() with async_cache=True:

+
ipr = IPRoute()
+ipr.bind(async_cache=True)
 ...  # do some stuff
 ipr.close()
 
@@ -143,7 +132,7 @@ verdict can be:

E.g.:

-
msg = ifinfmsg(data)
+
msg = ifinfmsg(data)
 msg.decode()
 ...  # mangle msg
 msg.reset()
@@ -180,28 +169,19 @@ type, one should inherit:

The messages hierarchy:

-Inheritance diagram of pyroute2.netlink.rtnl.ndmsg.ndmsg, pyroute2.netlink.rtnl.tcmsg.tcmsg, pyroute2.netlink.rtnl.rtmsg.rtmsg, pyroute2.netlink.rtnl.fibmsg.fibmsg, pyroute2.netlink.rtnl.ifaddrmsg.ifaddrmsg, pyroute2.netlink.rtnl.ifinfmsg.ifinfmsg, pyroute2.netlink.rtnl.ifinfmsg.ifinfveth, pyroute2.netlink.taskstats.taskstatsmsg, pyroute2.netlink.taskstats.tcmd, pyroute2.netlink.ctrlmsg, pyroute2.netlink.nl80211.nl80211cmd, pyroute2.netlink.nfnetlink.ipset.ipset_msg, pyroute2.netlink.ipq.ipq_mode_msg, pyroute2.netlink.ipq.ipq_packet_msg, pyroute2.netlink.ipq.ipq_verdict_msg - - - - - - - - - - - - - - - +Inheritance diagram of pyroute2.netlink.rtnl.ndmsg.ndmsg, pyroute2.netlink.rtnl.tcmsg.tcmsg, pyroute2.netlink.rtnl.rtmsg.rtmsg, pyroute2.netlink.rtnl.fibmsg.fibmsg, pyroute2.netlink.rtnl.ifaddrmsg.ifaddrmsg, pyroute2.netlink.rtnl.ifinfmsg.ifinfmsg, pyroute2.netlink.rtnl.ifinfmsg.ifinfveth, pyroute2.netlink.taskstats.taskstatsmsg, pyroute2.netlink.taskstats.tcmd, pyroute2.netlink.ctrlmsg, pyroute2.netlink.nl80211.nl80211cmd, pyroute2.netlink.nfnetlink.ipset.ipset_msg, pyroute2.netlink.ipq.ipq_mode_msg, pyroute2.netlink.ipq.ipq_packet_msg, pyroute2.netlink.ipq.ipq_verdict_msg +
+
+

PF_ROUTE messages

+

PF_ROUTE socket is used to receive notifications from the BSD +kernel. The PF_ROUTE messages:

+Inheritance diagram of pyroute2.bsd.pf_route.freebsd.bsdmsg, pyroute2.bsd.pf_route.freebsd.if_msg, pyroute2.bsd.pf_route.freebsd.rt_msg_base, pyroute2.bsd.pf_route.freebsd.ifa_msg_base, pyroute2.bsd.pf_route.freebsd.ifma_msg_base, pyroute2.bsd.pf_route.freebsd.if_announcemsg, pyroute2.bsd.pf_route.rt_slot, pyroute2.bsd.pf_route.rt_msg, pyroute2.bsd.pf_route.ifa_msg, pyroute2.bsd.pf_route.ifma_msg

IPDB

The IPDB module implements high-level logic to manage some of the system network settings. It is completely -agnostic to the netlink object’s nature, the only requirement +agnostic to the netlink object’s nature, the only requirement is that the netlink transport must provide RTNL API.

So, using proper mixin classes one can create a custom RTNL-compatible transport. E.g., this way IPDB can work @@ -211,13 +191,18 @@ main namespace.

The IPDB architecture is not too complicated, but it implements some useful transaction magic, see commit() methods of the Transactional objects.

-
+Inheritance diagram of pyroute2.ipdb.main.IPDB, pyroute2.ipdb.interfaces.Interface, pyroute2.ipdb.linkedset.LinkedSet, pyroute2.ipdb.linkedset.IPaddrSet, pyroute2.ipdb.routes.NextHopSet, pyroute2.ipdb.routes.Via, pyroute2.ipdb.routes.Encap, pyroute2.ipdb.routes.Metrics, pyroute2.ipdb.routes.BaseRoute, pyroute2.ipdb.routes.Route, pyroute2.ipdb.routes.MPLSRoute, pyroute2.ipdb.routes.RoutingTable, pyroute2.ipdb.routes.MPLSTable, pyroute2.ipdb.routes.RoutingTableSet, pyroute2.ipdb.rules.Rule, pyroute2.ipdb.rules.RulesDict + + +

Internet protocols

Beside of the netlink protocols, the library implements a limited set of supplementary internet protocol to play with.

-Inheritance diagram of pyroute2.protocols.udpmsg, pyroute2.protocols.ip4msg, pyroute2.protocols.udp4_pseudo_header, pyroute2.protocols.ethmsg, pyroute2.dhcp.dhcp4msg.dhcp4msg -
+Inheritance diagram of pyroute2.protocols.udpmsg, pyroute2.protocols.ip4msg, pyroute2.protocols.udp4_pseudo_header, pyroute2.protocols.ethmsg, pyroute2.dhcp.dhcp4msg.dhcp4msg + + +
@@ -236,6 +221,7 @@ limited set of supplementary internet pr
  • Netlink messages
  • +
  • PF_ROUTE messages
  • IPDB
  • Internet protocols
  • @@ -257,12 +243,14 @@ limited set of supplementary internet pr
    @@ -284,12 +272,13 @@ limited set of supplementary internet pr
  • previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/.buildinfo 0.5.2-1/docs/html/.buildinfo --- 0.4.21-0.1/docs/html/.buildinfo 2017-09-01 19:37:26.000000000 +0000 +++ 0.5.2-1/docs/html/.buildinfo 2018-06-19 08:31:09.000000000 +0000 @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 38885f03520045a9cfcb1b8f80b2d988 +config: 53ca616dc7a284a1681e6d03e9fd8242 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff -pruN 0.4.21-0.1/docs/html/changelog.html 0.5.2-1/docs/html/changelog.html --- 0.4.21-0.1/docs/html/changelog.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/changelog.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,37 +1,26 @@ + - + - - changelog — pyroute2 0.4.21 documentation - + Changelog — pyroute2 0.5.2 documentation - - + + - - - - + + + + +
    +
    @@ -55,35 +46,67 @@
    -

    changelog

    +

    Changelog

    • -
      0.4.21
      +
      0.5.2
    • -
      0.4.19
      +
      0.5.1
        -
      • ipdb: global methods review(), drop(), dump(), load()
      • -
      • ipdb: support VLAN protocol (802.1q, 802.1ad)
      • -
      • ipdb: initial support for IPv6 rules
      • -
      • ipdb: #388 – normalize IPv6 addresses
      • -
      • ipdb: #391 – support both IPv4 and IPv6 default routes
      • -
      • ipdb: #394 – correctly work with route priorities
      • +
      • ipdb: #310 – route keying fix
      • +
      • ipdb: #483, #484 – callback internals change
      • +
      • ipdb: #499 – eventloop interface
      • +
      • ipdb: #500 – fix non-default :: routes
      • +
      • netns: #448 – API change: setns() doesn’t remove FD
      • +
      • netns: #504 – fix resource leakage
      • +
      • bsd: initial commits
      • +
      +
      +
      +
    • +
    • +
      0.5.0
      +
        +
      • ACHTUNG: ipdb commit logic is changed
      • +
      • ipdb: do not drop failed transactions
      • +
      • ipdb: #388 – normalize IPv6 addresses
      • +
      • ipdb: #391 – support both IPv4 and IPv6 default routes
      • +
      • ipdb: #392 – fix MPLS route key reference
      • +
      • ipdb: #394 – correctly work with route priorities
      • +
      • ipdb: #408 – fix IPv6 routes in tables >= 256
      • +
      • ipdb: #416 – fix VRF interfaces creation
      • +
      • ipset: multiple improvements
      • +
      • tuntap: #469 – support s390x arch
      • +
      • nlsocket: #443 – fix socket methods resolve order for Python2
      • netns: non-destructive netns.create()
      @@ -92,13 +115,13 @@
    • 0.4.18
        -
      • ipdb: #379 [critical] – routes in global commits
      • -
      • ipdb: #380 – global commit with disabled plugins
      • -
      • ipdb: #381 – exceptions fixed
      • -
      • ipdb: #382 – manage dependent routes during interface commits
      • -
      • ipdb: #384 – global review()
      • -
      • ipdb: #385 – global drop()
      • -
      • netns: #383 – support ppc64
      • +
      • ipdb: #379 [critical] – routes in global commits
      • +
      • ipdb: #380 – global commit with disabled plugins
      • +
      • ipdb: #381 – exceptions fixed
      • +
      • ipdb: #382 – manage dependent routes during interface commits
      • +
      • ipdb: #384 – global review()
      • +
      • ipdb: #385 – global drop()
      • +
      • netns: #383 – support ppc64
      • general: public API refactored (same signatures; to be documented)
      @@ -107,9 +130,9 @@
    • 0.4.17
        -
      • req: #374 [critical] – mode nla init
      • -
      • iproute: #378 [critical] – fix flush_routes() to respect filters
      • -
      • ifinfmsg: #376 – fix data plugins API to support pyinstaller
      • +
      • req: #374 [critical] – mode nla init
      • +
      • iproute: #378 [critical] – fix flush_routes() to respect filters
      • +
      • ifinfmsg: #376 – fix data plugins API to support pyinstaller
      @@ -118,13 +141,13 @@
      0.4.16
      • ipdb: race fixed: remove port/bridge
      • -
      • ipdb: #280 – race fixed: port/bridge
      • -
      • ipdb: #302 – ipaddr views: [ifname].ipaddr.ipv4, [ifname]ipaddr.ipv6
      • -
      • ipdb: #357 – allow bridge timings to have some delta
      • -
      • ipdb: #338 – allow to fix interface objects from failed create()
      • -
      • rtnl: #336 – fix vlan flags
      • -
      • iproute: #342 – the match method takes any callable
      • -
      • nlsocket: #367 – increase default SO_SNDBUF
      • +
      • ipdb: #280 – race fixed: port/bridge
      • +
      • ipdb: #302 – ipaddr views: [ifname].ipaddr.ipv4, [ifname]ipaddr.ipv6
      • +
      • ipdb: #357 – allow bridge timings to have some delta
      • +
      • ipdb: #338 – allow to fix interface objects from failed create()
      • +
      • rtnl: #336 – fix vlan flags
      • +
      • iproute: #342 – the match method takes any callable
      • +
      • nlsocket: #367 – increase default SO_SNDBUF
      • ifinfmsg: support tuntap on armv6l, armv7l platforms
      @@ -133,9 +156,9 @@
    • 0.4.15
        -
      • req: #365 – full and short nla notation fixed, critical
      • -
      • iproute: #364 – new method, brport()
      • -
      • ipdb: – support bridge port options
      • +
      • req: #365 – full and short nla notation fixed, critical
      • +
      • iproute: #364 – new method, brport()
      • +
      • ipdb: – support bridge port options
      @@ -144,18 +167,18 @@
      0.4.14
      • event: new genl protocols set: VFS_DQUOT, acpi_event, thermal_event
      • -
      • ipdb: #310 – fixed priority change on routes
      • -
      • ipdb: #349 – fix setting ifalias on interfaces
      • -
      • ipdb: #353 – mitigate kernel oops during bridge creation
      • -
      • ipdb: #354 – allow to explicitly choose plugins to load
      • -
      • ipdb: #359 – provide read-only context managers
      • -
      • rtnl: #336 – vlan flags support
      • -
      • rtnl: #352 – support interface type plugins
      • -
      • tc: #344 – mirred action
      • -
      • tc: #346 – connmark action
      • -
      • netlink: #358 – memory optimization
      • -
      • config: #360 – generic asyncio config
      • -
      • iproute: #362 – allow to change or replace a qdisc
      • +
      • ipdb: #310 – fixed priority change on routes
      • +
      • ipdb: #349 – fix setting ifalias on interfaces
      • +
      • ipdb: #353 – mitigate kernel oops during bridge creation
      • +
      • ipdb: #354 – allow to explicitly choose plugins to load
      • +
      • ipdb: #359 – provide read-only context managers
      • +
      • rtnl: #336 – vlan flags support
      • +
      • rtnl: #352 – support interface type plugins
      • +
      • tc: #344 – mirred action
      • +
      • tc: #346 – connmark action
      • +
      • netlink: #358 – memory optimization
      • +
      • config: #360 – generic asyncio config
      • +
      • iproute: #362 – allow to change or replace a qdisc
    • @@ -169,7 +192,7 @@ ACHTUNG: this commit may break API compa
    • ipset: list:set support
    • ipdb: throw EEXIST when creates VLAN/VXLAN devs with same ID, but under different names
    • -
    • tests: #329 – include unit tests into the bundle
    • +
    • tests: #329 – include unit tests into the bundle
    • legal: E/// logo removed
    @@ -178,14 +201,14 @@ under different names
  • 0.4.12
      -
    • ipdb: #314 – let users choose RTNL groups IPDB listens to
    • -
    • ipdb: #321 – isolate net_ns_.* setup in a separate code block
    • -
    • ipdb: #322 – IPv6 updates on interfaces in DOWN state
    • +
    • ipdb: #314 – let users choose RTNL groups IPDB listens to
    • +
    • ipdb: #321 – isolate net_ns_.* setup in a separate code block
    • +
    • ipdb: #322 – IPv6 updates on interfaces in DOWN state
    • ifinfmsg: allow absolute/relative paths in the net_ns_fd NLA
    • -
    • ipset: #323 – support setting counters on ipset add
    • +
    • ipset: #323 – support setting counters on ipset add
    • ipset: headers() command
    • ipset: revisions
    • -
    • ipset: #326 – mark types
    • +
    • ipset: #326 – mark types
    @@ -193,13 +216,13 @@ under different names
  • 0.4.11
      -
    • rtnl: #284 – support vlan_flags
    • -
    • ipdb: #288 – do not inore link-local addresses
    • -
    • ipdb: #300 – sort ip addresses
    • -
    • ipdb: #306 – support net_ns_pid
    • -
    • ipdb: #307 – fix IPv6 routes management
    • -
    • ipdb: #311 – vlan interfaces address loading
    • -
    • iprsocket: #305 – support NETLINK_LISTEN_ALL_NSID
    • +
    • rtnl: #284 – support vlan_flags
    • +
    • ipdb: #288 – do not inore link-local addresses
    • +
    • ipdb: #300 – sort ip addresses
    • +
    • ipdb: #306 – support net_ns_pid
    • +
    • ipdb: #307 – fix IPv6 routes management
    • +
    • ipdb: #311 – vlan interfaces address loading
    • +
    • iprsocket: #305 – support NETLINK_LISTEN_ALL_NSID
    @@ -242,9 +265,9 @@ under different names
  • 0.4.6
      -
    • ipdb: #278 – fix initial ports mapping
    • -
    • ipset: #277 – fix ADT attributes parsing
    • -
    • nl80211: #274, #275, #276 – BSS-related fixes
    • +
    • ipdb: #278 – fix initial ports mapping
    • +
    • ipset: #277 – fix ADT attributes parsing
    • +
    • nl80211: #274, #275, #276 – BSS-related fixes
    @@ -262,9 +285,9 @@ under different names
  • 0.4.4
      -
    • iproute: #262 – get_vlans() fix
    • +
    • iproute: #262 – get_vlans() fix
    • iproute: default mask 32 for IPv4 in addr()
    • -
    • rtmsg: #260 – RTA_FLOW support
    • +
    • rtmsg: #260 – RTA_FLOW support
    @@ -272,7 +295,7 @@ under different names
  • 0.4.3
      -
    • ipdb: #259 – critical Interface class fix
    • +
    • ipdb: #259 – critical Interface class fix
    • benchmark: initial release
    @@ -285,8 +308,8 @@ under different names
  • ipdb: on-demand views
  • ipdb: rules management
  • ipdb: bridge controls
  • -
  • ipdb: #258 – important Python compatibility fixes
  • -
  • netns: #257 – pipe leak fix
  • +
  • ipdb: #258 – important Python compatibility fixes
  • +
  • netns: #257 – pipe leak fix
  • netlink: support pickling for nlmsg
  • @@ -297,8 +320,8 @@ under different names
    • netlink: no buffer copying in the parser
    • netlink: parse NLA on demand
    • -
    • ipdb: #244 – lwtunnel multipath fixes
    • -
    • iproute: #235 – route types
    • +
    • ipdb: #244 – lwtunnel multipath fixes
    • +
    • iproute: #235 – route types
    • docs updated
    @@ -309,15 +332,15 @@ under different names
    • ACHTUNG: old kernels compatibility code is dropped
    • ACHTUNG: IPDB uses two separate sockets for monitoring and commands
    • -
    • ipdb: #244 – multipath lwtunnel
    • -
    • ipdb: #242 – AF_MPLS routes
    • -
    • ipdb: #241, #234 – fix create(..., reuse=True)
    • -
    • ipdb: #239 – route encap and metrics fixed
    • -
    • ipdb: #238 – generic port management
    • -
    • ipdb: #235 – support route scope and type
    • -
    • ipdb: #230, #232 – routes GC (work in progress)
    • -
    • rtnl: #245 – do not fail if /proc/net/psched doesn’t exist
    • -
    • rtnl: #233 – support VRF interfaces (requires net-next)
    • +
    • ipdb: #244 – multipath lwtunnel
    • +
    • ipdb: #242 – AF_MPLS routes
    • +
    • ipdb: #241, #234 – fix create(…, reuse=True)
    • +
    • ipdb: #239 – route encap and metrics fixed
    • +
    • ipdb: #238 – generic port management
    • +
    • ipdb: #235 – support route scope and type
    • +
    • ipdb: #230, #232 – routes GC (work in progress)
    • +
    • rtnl: #245 – do not fail if /proc/net/psched doesn’t exist
    • +
    • rtnl: #233 – support VRF interfaces (requires net-next)
    @@ -325,7 +348,7 @@ under different names
  • 0.3.21
      -
    • ipdb: #231 – return ipdb.common as deprecated
    • +
    • ipdb: #231 – return ipdb.common as deprecated
    @@ -334,7 +357,7 @@ under different names
  • 0.3.20
    • iproute: vlan_filter()
    • -
    • iproute: #229 – FDB management
    • +
    • iproute: #229 – FDB management
    • general: exceptions re-exported via the root module
    @@ -343,9 +366,9 @@ under different names
  • 0.3.19
      -
    • rtmsg: #227 – MPLS lwtunnel basic support
    • +
    • rtmsg: #227 – MPLS lwtunnel basic support
    • iproute: route() docs updated
    • -
    • general: #228 – exceptions layout changed
    • +
    • general: #228 – exceptions layout changed
    • package-rh: rpm subpackages
    @@ -354,7 +377,7 @@ under different names
  • 0.3.18
      -
    • version bump – include docs in the release tarball
    • +
    • version bump – include docs in the release tarball
    @@ -363,13 +386,13 @@ under different names
  • 0.3.17
    • tcmsg: qdiscs and filters as plugins
    • -
    • tcmsg: #223 – tc clsact and bpf direct-action
    • +
    • tcmsg: #223 – tc clsact and bpf direct-action
    • tcmsg: plug, codel, choke, drr qdiscs
    • tests: CI in VMs (see civm project)
    • tests: xunit output
    • ifinfmsg: tuntap support in i386, i686
    • -
    • ifinfmsg: #207 – support vlan filters
    • -
    • examples: #226 – included in the release tarball
    • +
    • ifinfmsg: #207 – support vlan filters
    • +
    • examples: #226 – included in the release tarball
    • ipdb: partial commits, initial support
    @@ -394,8 +417,8 @@ under different names
  • 0.3.15
      -
    • netns: #194 – fix fd leak
    • -
    • iproute: #184 – fix routes dump
    • +
    • netns: #194 – fix fd leak
    • +
    • iproute: #184 – fix routes dump
    • rtnl: TCA_ACT_BPF support
    • rtnl: ipvlan support
    • rtnl: OVS support removed
    • @@ -430,12 +453,12 @@ under different names
      0.3.12
      • ipdb: new Interface.wait_ip() routine
      • -
      • ipdb: #175 – fix master attribute cleanup
      • -
      • ipdb: #171 – support multipath routes
      • +
      • ipdb: #175 – fix master attribute cleanup
      • +
      • ipdb: #171 – support multipath routes
      • ipdb: memory consumption improvements
      • rtmsg: MPLS support
      • rtmsg: RTA_VIA support
      • -
      • iwutil: #174 – fix FREQ_FIXED flag
      • +
      • iwutil: #174 – fix FREQ_FIXED flag
    @@ -443,8 +466,8 @@ under different names
  • 0.3.11
      -
    • ipdb: #161 – fix memory allocations
    • -
    • nlsocket: #161 – remove monitor mode
    • +
    • ipdb: #161 – fix memory allocations
    • +
    • nlsocket: #161 – remove monitor mode
    @@ -469,7 +492,7 @@ under different names
  • 0.3.9
      -
    • root imports: #109, #135 – issubclass, isinstance
    • +
    • root imports: #109, #135 – issubclass, isinstance
    • iwutil: multiple improvements
    • iwutil: initial tests
    • proxy: correctly forward NetlinkError
    • @@ -484,9 +507,9 @@ under different names
      0.3.8
      • docs: inheritance diagrams
      • -
      • nlsocket: #126, #132 – resource deallocation
      • -
      • arch: #128, #131 – MIPS support
      • -
      • setup.py: #133 – syntax error during install on Python2
      • +
      • nlsocket: #126, #132 – resource deallocation
      • +
      • arch: #128, #131 – MIPS support
      • +
      • setup.py: #133 – syntax error during install on Python2
    @@ -496,11 +519,11 @@ under different names
    • ipdb: new routing syntax
    • ipdb: sync interface movement between namespaces
    • -
    • ipdb: #125 – fix route metrics
    • +
    • ipdb: #125 – fix route metrics
    • netns: new class NSPopen
    • -
    • netns: #119 – i386 syscall
    • -
    • netns: #122 – return correct errno
    • -
    • netlink: #126 – fix socket reuse
    • +
    • netns: #119 – i386 syscall
    • +
    • netns: #122 – return correct errno
    • +
    • netlink: #126 – fix socket reuse
    @@ -521,9 +544,9 @@ under different names
  • 0.3.5
      -
    • netns: #90 – netns setns support
    • -
    • generic: #99 – support custom basic netlink socket classes
    • -
    • proxy-ng: #106 – provide more diagnostics
    • +
    • netns: #90 – netns setns support
    • +
    • generic: #99 – support custom basic netlink socket classes
    • +
    • proxy-ng: #106 – provide more diagnostics
    • nl80211: initial nl80211 support, iwutil module added
    @@ -532,13 +555,13 @@ under different names
  • 0.3.4
      -
    • ipdb: #92 – route metrics support
    • -
    • ipdb: #85 – broadcast address specification
    • -
    • ipdb, rtnl: #84 – veth support
    • +
    • ipdb: #92 – route metrics support
    • +
    • ipdb: #85 – broadcast address specification
    • +
    • ipdb, rtnl: #84 – veth support
    • ipdb, rtnl: tuntap support
    • -
    • netns: #84 – network namespaces support, NetNS class
    • +
    • netns: #84 – network namespaces support, NetNS class
    • rtnl: proxy-ng API
    • -
    • pypi: #91 – embed docs into the tarball
    • +
    • pypi: #91 – embed docs into the tarball
    @@ -548,7 +571,7 @@ under different names
    • ipdb: restart on error
    • generic: handle non-existing family case
    • -
    • [fix]: #80 – Python 2.6 unicode vs -O bug workaround
    • +
    • [fix]: #80 – Python 2.6 unicode vs -O bug workaround
    @@ -590,14 +613,14 @@ under different names
  • 0.2.15
      -
    • ipdb: fr #63 – interface settings freeze
    • -
    • ipdb: fr #50, #51 – bridge & bond options (initial version)
    • +
    • ipdb: fr #63 – interface settings freeze
    • +
    • ipdb: fr #50, #51 – bridge & bond options (initial version)
    • RHEL7 support
    • -
    • [fix]: #52 – HTB: correct rtab compilation
    • -
    • [fix]: #53 – RHEL6.5 bridge races
    • -
    • [fix]: #55 – IPv6 on bridges
    • -
    • [fix]: #58 – vlans as bridge ports
    • -
    • [fix]: #59 – threads sync in iocore
    • +
    • [fix]: #52 – HTB: correct rtab compilation
    • +
    • [fix]: #53 – RHEL6.5 bridge races
    • +
    • [fix]: #55 – IPv6 on bridges
    • +
    • [fix]: #58 – vlans as bridge ports
    • +
    • [fix]: #59 – threads sync in iocore
    @@ -605,9 +628,9 @@ under different names
  • 0.2.14
      -
    • [fix]: #44 – incorrect netlink exceptions proxying
    • -
    • [fix]: #45 – multiple issues with device targets
    • -
    • [fix]: #46 – consistent exceptions
    • +
    • [fix]: #44 – incorrect netlink exceptions proxying
    • +
    • [fix]: #45 – multiple issues with device targets
    • +
    • [fix]: #46 – consistent exceptions
    • ipdb: LinkedSet cascade updates fixed
    • ipdb: allow to reuse existing interface in create()
    @@ -617,7 +640,7 @@ under different names
  • 0.2.13
      -
    • [fix]: #43 – pipe leak in the main I/O loop
    • +
    • [fix]: #43 – pipe leak in the main I/O loop
    • tests: integrate examples, import into tests
    • iocore: use own TimeoutException instead of Queue.Empty
    • iproute: default routing table = 254
    • @@ -632,8 +655,8 @@ under different names
    • 0.2.12
        -
      • [fix]: #33 – release resources only for bound sockets
      • -
      • [fix]: #37 – fix commit targets
      • +
      • [fix]: #33 – release resources only for bound sockets
      • +
      • [fix]: #37 – fix commit targets
      • rtnl: HFSC support
      • rtnl: priomap fixed
      @@ -658,9 +681,9 @@ under different names
    • 0.2.10
      • ipdb: command chaining
      • -
      • ipdb: fix for RHEL6.5 Python “optimizations”
      • +
      • ipdb: fix for RHEL6.5 Python “optimizations”
      • rtnl: support TCA_U32_ACT
      • -
      • [fix]: #32 – NLA comparison
      • +
      • [fix]: #32 – NLA comparison
    @@ -669,7 +692,7 @@ under different names
  • 0.2.9
    • ipdb: support bridges and bonding interfaces on RHEL
    • -
    • ipdb: “shadow” interfaces (still in alpha state)
    • +
    • ipdb: “shadow” interfaces (still in alpha state)
    • ipdb: minor fixes on routing and compat issues
    • ipdb: as a separate package (sub-module)
    • docs: include ipdb autodocs
    • @@ -686,7 +709,7 @@ under different names
    • iocore: support forked IOCore and IOBroker as a separate process
    • ipdb: generic callbacks support
    • ipdb: routing support
    • -
    • rtnl: #30 – support IFLA_INFO_DATA for bond interfaces
    • +
    • rtnl: #30 – support IFLA_INFO_DATA for bond interfaces
    @@ -725,7 +748,7 @@ under different names
  • 0.2.3
      -
    • [fix]: #28 – bundle issue
    • +
    • [fix]: #28 – bundle issue
    @@ -770,11 +793,11 @@ under different names
  • 0.1.10
      -
    • [fix]: #8 – default route fix, routes filtering
    • -
    • [fix]: #9 – add/delete route routine improved
    • -
    • [fix]: #10 – shutdown sequence fixed
    • -
    • [fix]: #11 – close IPC pipes on release()
    • -
    • [fix]: #12 – stop service threads on release()
    • +
    • [fix]: #8 – default route fix, routes filtering
    • +
    • [fix]: #9 – add/delete route routine improved
    • +
    • [fix]: #10 – shutdown sequence fixed
    • +
    • [fix]: #11 – close IPC pipes on release()
    • +
    • [fix]: #12 – stop service threads on release()
    • netlink: debug mode added to be used with GUI
    • ipdb: interface removal
    • ipdb: fail on transaction sync timeout
    • @@ -812,7 +835,7 @@ under different names
      • ipdb: interface creation: dummy, bond, bridge, vlan
      • ipdb: if_slaves interface obsoleted
      • -
      • ipdb: ‘direct’ mode
      • +
      • ipdb: ‘direct’ mode
      • iproute: code refactored
      • examples: create() examples committed
      @@ -894,10 +917,10 @@ under different names

      Previous topic

      pyroute2

      + title="previous chapter">Pyroute2

      Next topic

      makefile documentation

      + title="next chapter">Makefile documentation

      This Page

        @@ -907,12 +930,14 @@ under different names
      @@ -929,17 +954,18 @@ under different names modules |
    • - next |
    • - previous |
    • - + +
  • \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/debug.html 0.5.2-1/docs/html/debug.html --- 0.4.21-0.1/docs/html/debug.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/debug.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - Netlink debug howto — pyroute2 0.4.21 documentation - + Netlink debug howto — pyroute2 0.5.2 documentation - - + + @@ -28,10 +18,9 @@ - - + + +
    +
    @@ -62,7 +53,7 @@ process with strace -p. Use -s {int} argument to make sure that all the messages are dumped. The -x argument instructs strace to produce output in the hex format that can be passed to the pyroute2 decoder:

    -
    $ strace -e trace=network -x -s 16384 ip ro
    +
    $ strace -e trace=network -x -s 16384 ip ro
     socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE) = 3
     setsockopt(3, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
     setsockopt(3, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
    @@ -87,7 +78,7 @@ recvmsg(3, {msg_name(12)={sa_family=AF_N
     

    Starting with version 4.13, strace parses Netlink message headers and displays them in their parsed form instead of displaying the whole buffer in its raw form. The rest of the buffer is still shown, but due to it being -incomplete, the method mentioned above doesn’t work anymore.

    +incomplete, the method mentioned above doesn’t work anymore.

    For the time being, the easiest workaround is probably to use an older strace version as it only depends on libc6.

    @@ -95,24 +86,24 @@ version as it only depends on libc6.

    Decode data

    The decoder is not provided with rpm or pip packages, so you should have a local git repo of the project:

    -
    $ git clone <url>
    +
    $ git clone <url>
     $ cd pyroute2
     

    Now run the decoder:

    -
    $ export PYTHONPATH=`pwd`
    +
    $ export PYTHONPATH=`pwd`
     $ python tests/decoder/decoder.py <message.class> <data>
     

    E.g. for the route dump in the file rt.dump the command line should be:

    -
    $ python tests/decoder/decoder.py \
    +
    $ python tests/decoder/decoder.py \
         pyroute2.netlink.rtnl.rtmsg.rtmsg \
         rt.dump
     

    Why should I specify the message class? Why there is no marshalling -in the decoder script? ‘Cause it is intended to be used with different +in the decoder script? ‘Cause it is intended to be used with different netlink protocols, not only RTNL, but also nl80211, nfnetlink etc. There is no common marshalling for all the netlink protocols.

    How to specify the message class? All the netlink protocols are @@ -134,7 +125,7 @@ want.

  • The #! symbols start a comment until the end of the file.
  • Example:

    -
    # ifinfmsg headers
    +
    # ifinfmsg headers
     #
     # nlmsg header
     \x84\x00\x00\x00  # length
    @@ -158,7 +149,7 @@ want.
     only compiles and collects requests instead of sending them to the
     kernel. E.g., it is used by IPBatch, that combines BatchSocket
     with IPRouteMixin, providing RTNL compiler:

    -
    $ python3
    +
    $ python3
     Python 3.4.3 (default, Mar 31 2016, 20:42:37)
     [GCC 5.3.1 20151207 (Red Hat 5.3.1-2)] on linux
     Type "help", "copyright", "credits" or "license" for more information.
    @@ -190,7 +181,7 @@ instead of hexdump(ipb.batch)send() call sends several messages at once, or
     to produce binary buffers to test your own netlink parsers. Or just
     to dump some data to be sent later and probably even on another host:

    -
    >>> ipr = IPRoute()
    +
    >>> ipr = IPRoute()
     >>> ipr.sendto(ipb.batch, (0, 0))
     
    @@ -231,12 +222,14 @@ so if there will be any responses, they
    @@ -258,12 +251,13 @@ so if there will be any responses, they
  • previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/devcontribute.html 0.5.2-1/docs/html/devcontribute.html --- 0.4.21-0.1/docs/html/devcontribute.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/devcontribute.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - Project contribution guide — pyroute2 0.4.21 documentation - + Project contribution guide — pyroute2 0.5.2 documentation - - + + @@ -28,10 +18,9 @@ - - + + +
    +
    @@ -114,12 +105,14 @@ the makefile parameters see in REA
    @@ -141,12 +134,13 @@ the makefile parameters see in REA
  • previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/devgeneral.html 0.5.2-1/docs/html/devgeneral.html --- 0.4.21-0.1/docs/html/devgeneral.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/devgeneral.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,35 +1,24 @@ + - + - - Modules layout — pyroute2 0.4.21 documentation - + Modules layout — pyroute2 0.5.2 documentation - - + + - - + + +
    +
    @@ -56,7 +47,7 @@ you think you can do it, this document s

    Modules layout

    The library consists of several significant parts, and every part has its own functionality:

    -
    NetlinkSocket: connects the library to the OS
    +
    NetlinkSocket: connects the library to the OS
       ↑       ↑
       |       |
       |       ↓
    @@ -82,7 +73,7 @@ with eventlet library, that
     uses some different marshalling algo from usual netlink.
     Otherwise it is enough to use register_policy method of
     the NetlinkSocket:

    -
    # somewhere in a custom netlink class
    +
    # somewhere in a custom netlink class
     
     # dict key: message id, int
     # dict value: message class
    @@ -111,13 +102,13 @@ netlink docs: 
     

    NL utility classes

    They are based on different netlink sockets, such as IPRsocket (RTNL), NL80211 (wireless), or just -NetlinkSocket – be it generic netlink or nfnetlink +NetlinkSocket – be it generic netlink or nfnetlink (see taskstats and ipset).

    Primarily, pyroute2 is a netlink framework, so basic classes and low-level utilities are intended to return @@ -142,7 +133,7 @@ provided, such as IPDB.

    Deferred imports

    The file pyroute2/__init__.py is a proxy for some modules, thus providing a fixed import address, like:

    -
    from pyroute2 import IPRoute
    +
    from pyroute2 import IPRoute
     ipr = IPRoute()
     ...
     ipr.close()
    @@ -161,7 +152,7 @@ use a reference implementation. Lets say
     ipset_msg class using the kernel code, and want to check
     how it works. So the ipset(8) utility will be used as a
     reference implementation:

    -
    $ sudo strace -e trace=network -f -x -s 4096 ipset list
    +
    $ sudo strace -e trace=network -f -x -s 4096 ipset list
     socket(PF_NETLINK, SOCK_RAW, NETLINK_NETFILTER) = 3
     bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
     getsockname(3, {sa_family=AF_NETLINK, pid=7009, groups=00000000}, [12]) = 0
    @@ -176,7 +167,7 @@ recvmsg(3, {msg_name(12)={sa_family=AF_N
     

    Here you can just copy packet strings from sendto and recvmsg, place in a file and use scripts/decoder.py to inspect them:

    -
    $ export PYTHONPATH=`pwd`
    +
    $ export PYTHONPATH=`pwd`
     $ python scripts/decoder.py \
         pyroute2.netlink.nfnetlink.ipset.ipset_msg \
         scripts/ipset_01.data
    @@ -215,12 +206,14 @@ ignores spaces and allows multiple messa
        
    @@ -236,12 +229,13 @@ ignores spaces and allows multiple messa
  • modules |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/devmodules.html 0.5.2-1/docs/html/devmodules.html --- 0.4.21-0.1/docs/html/devmodules.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/devmodules.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,35 +1,24 @@ + - + - - Modules in progress — pyroute2 0.4.21 documentation - + Modules in progress — pyroute2 0.5.2 documentation - - + + - - + + +
    +
    @@ -58,7 +49,7 @@ valuable. You are more than just welcome other ipset structures (like hash:net,iface). There is no guarantee that this module is working with all available ipset modules.

    It supports almost all kernel commands (create, destroy, flush, -rename, swap, test...)

    +rename, swap, test…)

    class pyroute2.ipset.IPSet(version=6, attr_revision=None, nfgen_family=2)
    @@ -66,29 +57,60 @@ rename, swap, test...)

    Implements API to the ipset functionality.

    -add(name, entry, family=2, exclusive=True, comment=None, timeout=None, etype='ip', **kwargs)
    +add(name, entry, family=2, exclusive=True, comment=None, timeout=None, etype='ip', skbmark=None, skbprio=None, skbqueue=None, **kwargs)

    Add a member to the ipset.

    -

    etype is the entry type that you add to the ipset. It’s related to -the ipset type. For example, use “ip” for one hash:ip or bitmap:ip +

    etype is the entry type that you add to the ipset. It’s related to +the ipset type. For example, use “ip” for one hash:ip or bitmap:ip ipset.

    -

    When your ipset store a tuple, like “hash:net,iface”, you must use a -comma a separator (etype=”net,iface”)

    +

    When your ipset store a tuple, like “hash:net,iface”, you must use a +comma a separator (etype=”net,iface”)

    +

    entry is a string for “ip” and “net” objects. For ipset with several +dimensions, you must use a tuple (or a list) of objects.

    +

    “port” type is specific, since you can use integer of specialized +containers like PortEntry and PortRange

    +

    Examples:

    +
    ipset = IPSet()
    +ipset.create("foo", stype="hash:ip")
    +ipset.add("foo", "198.51.100.1", etype="ip")
    +
    +ipset = IPSet()
    +ipset.create("bar", stype="bitmap:port",
    +             bitmap_ports_range=(1000, 2000))
    +ipset.add("bar", 1001, etype="port")
    +ipset.add("bar", PortRange(1500, 2000), etype="port")
    +
    +ipset = IPSet()
    +import socket
    +protocol = socket.getprotobyname("tcp")
    +ipset.create("foobar", stype="hash:net,port")
    +port_entry = PortEntry(80, protocol=protocol)
    +ipset.add("foobar", ("198.51.100.0/24", port_entry),
    +          etype="net,port")
    +
    +
    -create(name, stype='hash:ip', family=2, exclusive=True, counters=False, comment=False, maxelem=65536, forceadd=False, hashsize=None, timeout=None)
    +create(name, stype='hash:ip', family=2, exclusive=True, counters=False, comment=False, maxelem=65536, forceadd=False, hashsize=None, timeout=None, bitmap_ports_range=None, size=None, skbinfo=False)

    Create an ipset name of type stype, by default hash:ip.

    Common ipset options are supported:

      -
    • exclusive – if set, raise an error if the ipset exists
    • -
    • counters – enable data/packets counters
    • -
    • comment – enable comments capability
    • -
    • maxelem – max size of the ipset
    • -
    • forceadd – you should refer to the ipset manpage
    • -
    • hashsize – size of the hashtable (if any)
    • -
    • timeout – enable and set a default value for entries (if not None)
    • +
    • exclusive – if set, raise an error if the ipset exists
    • +
    • counters – enable data/packets counters
    • +
    • comment – enable comments capability
    • +
    • maxelem – max size of the ipset
    • +
    • forceadd – you should refer to the ipset manpage
    • +
    • hashsize – size of the hashtable (if any)
    • +
    • timeout – enable and set a default value for entries (if not None)
    • +
    • +
      bitmap_ports_range – set the specified inclusive portrange for
      +
      the bitmap ipset structure (0, 65536)
      +
      +
    • +
    • size – Size of the list:set, the default is 8
    • +
    • skbinfo – enable skbinfo capability
    @@ -96,13 +118,13 @@ comma a separator (etype=”net,ifac
    delete(name, entry, family=2, exclusive=True, etype='ip')

    Delete a member from the ipset.

    -

    See add method for more information on etype.

    +

    See add() method for more information on etype.

    destroy(name=None)
    -

    Destroy one or all ipset (when name is None)

    +

    Destroy one (when name is set) or all ipset (when name is None)

    @@ -114,7 +136,19 @@ comma a separator (etype=”net,ifac
    get_supported_revisions(stype, family=2)
    -

    Return minimum and maximum of revisions supported by the kernel

    +

    Return minimum and maximum of revisions supported by the kernel.

    +

    Each ipset module (like hash:net, hash:ip, etc) has several +revisions. Newer revisions often have more features or more +performances. Thanks to this call, you can ask the kernel +the list of supported revisions.

    +

    You can manually set/force revisions used in IPSet constructor.

    +

    Example:

    +
    ipset = IPSet()
    +ipset.get_supported_revisions("hash:net")
    +
    +ipset.get_supported_revisions("hash:net,port,net")
    +
    +
    @@ -142,18 +176,41 @@ exit, you will receive an empty list.

    swap(set_a, set_b)
    -

    Swap two ipsets

    +

    Swap two ipsets. They must have compatible content type.

    test(name, entry, family=2, etype='ip')
    -

    Test if a member is part of an ipset

    -

    See add method for more information on etype.

    +

    Test if entry is part of an ipset

    +

    See add() method for more information on etype.

    +
    +
    +class pyroute2.ipset.PortEntry(port, protocol=None)
    +

    A simple container for port entry with optional protocol

    +
    + +
    +
    +class pyroute2.ipset.PortRange(begin, end, protocol=None)
    +

    A simple container for port range with optional protocol

    +

    Note that optional protocol parameter is not supported by all +kernel ipset modules using ports. On the other hand, it’s sometimes +mandatory to set it (like for hash:net,port ipsets)

    +

    Example:

    +
    udp_proto = socket.getprotobyname("udp")
    +port_range = PortRange(1000, 2000, protocol=udp_proto)
    +ipset.create("foo", stype="hash:net,port")
    +ipset.add("foo", ("192.0.2.0/24", port_range), etype="net,port")
    +ipset.test("foo", ("192.0.2.0/24", port_range), etype="net,port")
    +
    +
    +
    +

    IW module

    @@ -163,27 +220,27 @@ exit, you will receive an empty list.

    Unlike IPRoute, which is mostly usable, though is far from complete yet, the IW module is in the very initial state. Neither the module itself, nor the message class cover the -nl80211 functionality reasonably enough. So if you’re +nl80211 functionality reasonably enough. So if you’re going to use it, brace yourself — debug is coming.

    Messages

    nl80211 messages are defined here:

    -
    pyroute2/netlink/nl80211/__init__.py
    +
    pyroute2/netlink/nl80211/__init__.py
     

    Pls notice NLAs of type hex. On the early development stage hex allows to inspect incoming data as a hex dump and, -occasionally, even make requests with such NLAs. But it’s +occasionally, even make requests with such NLAs. But it’s not a production way.

    The type hex in the NLA definitions means that this particular NLA is not handled yet properly. If you want to use some NLA which is defined as hex yet, pls find out a specific type, patch the message class and submit your pull request on github.

    -

    If you’re not familiar with NLA types, take a look at RTNL +

    If you’re not familiar with NLA types, take a look at RTNL definitions:

    -
    pyroute2/netlink/rtnl/ndmsg.py
    +
    pyroute2/netlink/rtnl/ndmsg.py
     

    and so on.

    @@ -202,7 +259,7 @@ definitions:

    There are no errors on put() usually. Any permission denied, any invalid value errors are returned from the kernel with -netlink also. So if you do put(), but don’t do get(), be +netlink also. So if you do put(), but don’t do get(), be prepared to miss errors.

    The preferred method for the communication is nlm_request(). It tracks the message ID, returns the corresponding response. @@ -212,10 +269,10 @@ To get the response on any operation wit

    Reverse it

    -

    If you’re too lazy to read the kernel sources, but still need +

    If you’re too lazy to read the kernel sources, but still need something not implemented here, you can use reverse engineering on a reference implementation. E.g.:

    -
    # strace -e trace=network -f -x -s 4096 \
    +
    # strace -e trace=network -f -x -s 4096 \
             iw phy phy0 interface add test type monitor
     
    @@ -223,7 +280,7 @@ on a reference implementation. E.g.:

    the kernel. Three first packets are the generic netlink protocol discovery, you can ignore them. All that follows, is the nl80211 traffic:

    -
    sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, ... },
    +
    sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, ... },
         msg_iov(1)=[{"\x30\x00\x00\x00\x1b\x00\x05 ...", 48}],
         msg_controllen=0, msg_flags=0}, 0) = 48
     recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, ... },
    @@ -233,15 +290,15 @@ nl80211 traffic:

    With -s 4096 you will get the full dump. Then copy the strings -from msg_iov to a file, let’s say data, and run the decoder:

    -
    $ pwd
    +from msg_iov to a file, let’s say data, and run the decoder:

    +
    $ pwd
     /home/user/Projects/pyroute2
     $ export PYTHONPATH=`pwd`
     $ python scripts/decoder.py pyroute2.netlink.nl80211.nl80211cmd data
     

    You will get the session decoded:

    -
    {'attrs': [['NL80211_ATTR_WIPHY', 0],
    +
    {'attrs': [['NL80211_ATTR_WIPHY', 0],
                ['NL80211_ATTR_IFNAME', 'test'],
                ['NL80211_ATTR_IFTYPE', 6]],
      'cmd': 7,
    @@ -276,10 +333,188 @@ response. Sample collected data is in th
     

    Submit changes

    Please do not hesitate to submit the changes on github. Without your patches this module will not evolve.

    +
    +
    +class pyroute2.iwutil.IW(*argv, **kwarg)
    +
    +
    +add_interface(ifname, iftype, dev=None, phy=0)
    +

    Create a virtual interface

    +
    +
      +
    • ifname — name of the interface to create
    • +
    • iftype — interface type to create
    • +
    • dev — device index
    • +
    • phy — phy index
    • +
    +
    +

    One should specify dev (device index) or phy +(phy index). If no one specified, phy == 0.

    +

    iftype can be integer or string:

    +
      +
    1. adhoc
    2. +
    3. station
    4. +
    5. ap
    6. +
    7. ap_vlan
    8. +
    9. wds
    10. +
    11. monitor
    12. +
    13. mesh_point
    14. +
    15. p2p_client
    16. +
    17. p2p_go
    18. +
    19. p2p_device
    20. +
    21. ocb
    22. +
    +
    + +
    +
    +associate(ifindex, bssid, ssid, freq, info_elements=None)
    +

    Send an Association request frame.

    +
    + +
    +
    +authenticate(ifindex, bssid, ssid, freq, auth_type=0)
    +

    Send an Authentication management frame.

    +
    + +
    +
    +connect(ifindex, ssid, bssid=None)
    +

    Connect to the ap with ssid and bssid

    +
    + +
    +
    +deauthenticate(ifindex, bssid, reason_code=1)
    +

    Send a Deauthentication management frame.

    +
    + +
    +
    +del_interface(dev)
    +

    Delete a virtual interface

    +
    +
      +
    • dev — device index
    • +
    +
    +
    + +
    +
    +disassociate(ifindex, bssid, reason_code=3)
    +

    Send a Disassociation management frame.

    +
    + +
    +
    +disconnect(ifindex)
    +

    Disconnect the device

    +
    + +
    +
    +get_associated_bss(ifindex)
    +

    Returns the same info like scan() does, but only about the +currently associated BSS.

    +

    Unlike scan(), it returns immediately and doesn’t require root.

    +
    + +
    +
    +get_interface_by_ifindex(ifindex)
    +

    Get interface by ifindex ( use x.get_attr(‘NL80211_ATTR_IFINDEX’)

    +
    + +
    +
    +get_interface_by_phy(attr)
    +

    Get interface by phy ( use x.get_attr(‘NL80211_ATTR_WIPHY’) )

    +
    + +
    +
    +get_interfaces_dict()
    +

    Get interfaces dictionary

    +
    + +
    +
    +get_interfaces_dump()
    +

    Get interfaces dump

    +
    + +
    +
    +get_stations(ifindex)
    +

    Get stations by ifindex

    +
    + +
    +
    +join_ibss(ifindex, ssid, freq, bssid=None, channel_fixed=False, width=None, center=None, center2=None)
    +
    +
    Connect to network by ssid
    +
      +
    • ifindex - IFINDEX of the interface to perform the connection
    • +
    • ssid - Service set identification
    • +
    • freq - Frequency in MHz
    • +
    • bssid - The MAC address of target interface
    • +
    • channel_fixed: Boolean flag
    • +
    • width - Channel width
    • +
    • center - Central frequency of the 40/80/160 MHz channel
    • +
    • center2 - Center frequency of second segment if 80P80
    • +
    +
    +
    +

    If the flag of channel_fixed is True, one should specify both the width +and center of the channel

    +

    width can be integer of string:

    +
      +
    1. 20_noht
    2. +
    3. 20
    4. +
    5. 40
    6. +
    7. 80
    8. +
    9. 80p80
    10. +
    11. 160
    12. +
    13. 5
    14. +
    15. 10
    16. +
    +
    + +
    +
    +leave_ibss(ifindex)
    +

    Leave the IBSS – the IBSS is determined by the network interface

    +
    + +
    +
    +list_dev()
    +

    Get list of all wifi network interfaces

    +
    + +
    +
    +list_wiphy()
    +

    Get list of all phy devices

    +
    + +
    +
    +scan(ifindex, ssids=None, flush_cache=False)
    +

    Trigger scan and get results.

    +

    Triggering scan usually requires root, and can take a +couple of seconds.

    +
    + +
    +
    -

    Network settings daemon – pyrouted

    +

    Network settings daemon – pyrouted

    Pyrouted is a standalone project of a system service, that utilizes the pyroute2 library. It consists of a daemon controlled by systemd and a CLI utility that communicates @@ -312,7 +547,7 @@ tool.

  • Submit changes
  • -
  • Network settings daemon – pyrouted
  • +
  • Network settings daemon – pyrouted
  • @@ -326,12 +561,14 @@ tool.

    @@ -347,12 +584,13 @@ tool.

  • modules |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/dhcp.html 0.5.2-1/docs/html/dhcp.html --- 0.4.21-0.1/docs/html/dhcp.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/dhcp.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,35 +1,24 @@ + - + - - DHCP support — pyroute2 0.4.21 documentation - + DHCP support — pyroute2 0.5.2 documentation - - + + - - + + +
    +
    @@ -69,9 +60,9 @@ syntax is more or less compatible.

    Packet fields

    There are two big groups of items within any DHCP packet. -First, there are BOOTP/DHCP packet fields, they’re defined +First, there are BOOTP/DHCP packet fields, they’re defined with the fields attribute:

    -
    class dhcp4msg(msg):
    +
    class dhcp4msg(msg):
         fields = ((name, format, policy),
                   (name, format, policy),
                   ...
    @@ -89,25 +80,25 @@ literal, and it will mean that it is a d
     should be encoded if no other value is given.

    But when the policy is a dictionary, it can contain keys as follows:

    -
    'l2addr': {'format': '6B',
    +
    'l2addr': {'format': '6B',
                'decode': ...,
                'encode': ...}
     

    Keys encode and decode should contain filters to be used in decoding and encoding procedures. The encoding filter -should accept the value from user’s definition and should +should accept the value from user’s definition and should return a value that can be packed using format. The decoding filter should accept a value, decoded according to format, and should return value that can be used by a user.

    The struct module can not decode IP addresses etc, so they should be decoded as 4s, e.g. Further transformation from -4 bytes string to a string like ‘10.0.0.1’ performs the filter.

    +4 bytes string to a string like ‘10.0.0.1’ performs the filter.

    DHCP options

    DHCP options are described in a similar way:

    -
    options = ((code, name, format),
    +
    options = ((code, name, format),
                (code, name, format),
                ...
                (code, name, format))
    @@ -122,14 +113,14 @@ class.

    Every option class can be decoded in two ways. If it has fixed width fields, it can be decoded with ordinary msg routines, and in this case it can look like that:

    -
    class client_id(option):
    +
    class client_id(option):
         fields = (('type', 'uint8'),
                   ('key', 'l2addr'))
     

    If it must be decoded by some custom rules, one can define the policy just like for the fields above:

    -
    class array8(option):
    +
    class array8(option):
         policy = {'format': 'string',
                   'encode': lambda x: array('B', x).tobytes(),
                   'decode': lambda x: array('B', x).tolist()}
    @@ -138,8 +129,66 @@ policy just like for the fields above:In the corresponding modules, like in pyroute2.dhcp.dhcp4msg,
     one can define as many custom DHCP options, as one need. Just
     be sure, that they are compatible with the DHCP server and all
    -fit into 1..254 (uint8) – the 0 code is used for padding and
    +fit into 1..254 (uint8) – the 0 code is used for padding and
     the code 255 is the end of options code.

    +
    +
    +class pyroute2.dhcp.array
    +
    +
    +tobytes()
    +

    tostring() -> string

    +

    Convert the array to an array of machine values and return the string +representation.

    +
    + +
    + +
    +
    +class pyroute2.dhcp.dhcpmsg(content=None, buf='', offset=0, value=None)
    +
    +
    +class array8(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    +
    +class be16(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    +
    +class be32(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    +
    +class client_id(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    +
    +class none(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    +
    +class string(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    +
    +class uint8(content=None, buf='', offset=0, value=None, code=0)
    +
    + +
    + +
    +
    +class pyroute2.dhcp.option(content=None, buf='', offset=0, value=None, code=0)
    +
    +
    @@ -149,7 +198,7 @@ the code 255 is the end of options code. class pyroute2.dhcp.dhcp4socket.DHCP4Socket(ifname, port=68)

    Parameters:

      -
    • ifname – interface name to work on
    • +
    • ifname – interface name to work on

    This raw socket binds to an interface and installs BPF filter to get only its UDP port. It can be used in poll/select and @@ -157,7 +206,7 @@ provides also the context manager protoc with statements.

    It does not provide any DHCP state machine, and does not inspect DHCP packets, it is totally up to you. No default values are -provided here, except xid – DHCP transaction ID. If xid is +provided here, except xid – DHCP transaction ID. If xid is not provided, DHCP4Socket generates it for outgoing messages.

    @@ -173,13 +222,13 @@ rest is interpreted as DHCP.

    put(msg=None, dport=67)

    Put DHCP message. Parameters:

      -
    • msg – dhcp4msg instance
    • -
    • dport – DHCP server port
    • +
    • msg – dhcp4msg instance
    • +
    • dport – DHCP server port

    If msg is not provided, it is constructed as default BOOTREQUEST + DHCPDISCOVER.

    Examples:

    -
    sock.put(dhcp4msg({'op': BOOTREQUEST,
    +
    sock.put(dhcp4msg({'op': BOOTREQUEST,
                        'chaddr': 'ff:11:22:33:44:55',
                        'options': {'message_type': DHCPREQUEST,
                                    'parameter_list': [1, 3, 6, 12, 15],
    @@ -224,12 +273,14 @@ there xid (transaction id)
        
    @@ -245,12 +296,13 @@ there xid (transaction id)
  • modules |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/general.html 0.5.2-1/docs/html/general.html --- 0.4.21-0.1/docs/html/general.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/general.html 2018-06-19 08:31:08.000000000 +0000 @@ -1,37 +1,26 @@ + - + - - pyroute2 — pyroute2 0.4.21 documentation - + Pyroute2 — pyroute2 0.5.2 documentation - - + + - - - - + + + + +
    +
    @@ -55,40 +46,48 @@
    -

    pyroute2

    +

    Pyroute2

    Pyroute2 is a pure Python netlink library. It requires only Python stdlib, no 3rd party libraries. The library was started as an RTNL protocol implementation, so the name is pyroute2, but now it supports many netlink protocols. Some supported netlink families and protocols:

      -
    • rtnl, network settings — addresses, routes, traffic controls
    • -
    • nfnetlink — netfilter API: ipset, nftables, ...
    • -
    • ipq — simplest userspace packet filtering, iptables QUEUE target
    • -
    • devlink — manage and monitor devlink-enabled hardware
    • +
    • rtnl, network settings — addresses, routes, traffic controls
    • +
    • nfnetlink — netfilter API: ipset, nftables, …
    • +
    • ipq — simplest userspace packet filtering, iptables QUEUE target
    • +
    • devlink — manage and monitor devlink-enabled hardware
    • -
      generic — generic netlink families
      +
      generic — generic netlink families
        -
      • nl80211 — wireless functions API (basic support)
      • -
      • taskstats — extended process statistics
      • -
      • acpi_events — ACPI events monitoring
      • -
      • thermal_events — thermal events monitoring
      • -
      • VFS_DQUOT — disk quota events monitoring
      • +
      • nl80211 — wireless functions API (basic support)
      • +
      • taskstats — extended process statistics
      • +
      • acpi_events — ACPI events monitoring
      • +
      • thermal_events — thermal events monitoring
      • +
      • VFS_DQUOT — disk quota events monitoring
    +

    Starting with 0.5.2 the library supports also PF_ROUTE sockets on BSD systems.

    +
    +

    Supported systems

    +

    Pyroute2 runs natively on Linux and emulates some limited subset +of RTNL netlink API on BSD systems on top of PF_ROUTE notifications +and standard system tools.

    +

    Other platforms are not supported.

    +
    -

    the simplest usecase

    -

    The socket objects, provided by the library, are actual socket objects with a -little bit extended API. The additional functionality aims to:

    +

    The simplest usecase

    +

    The objects, provided by the library, are socket objects with an +extended API. The additional functionality aims to:

    • Help to open/bind netlink sockets
    • Discover generic netlink protocols and multicast groups
    • -
    • Construct, encode and decode netlink messages
    • +
    • Construct, encode and decode netlink and PF_ROUTE messages

    Maybe the simplest usecase is to monitor events. Disk quota events:

    -
    from pyroute2 import DQuotSocket
    +
    from pyroute2 import DQuotSocket
     # DQuotSocket automatically performs discovery and binding,
     # since it has no other functionality beside of the monitoring
     with DQuotSocket() as ds:
    @@ -96,8 +95,8 @@ little bit extended API. The additional
             print(message)
     
    -

    Or IPRoute:

    -
    from pyroute2 import IPRoute
    +

    Get notifications about network settings changes with IPRoute:

    +
    from pyroute2 import IPRoute
     with IPRoute() as ipr:
         # With IPRoute objects you have to call bind() manually
         ipr.bind()
    @@ -106,14 +105,14 @@ little bit extended API. The additional
     
    -
    -
    -class pyroute2.iproute.RawIPRoute(fileno=None)
    +
    +class pyroute2.iproute.linux.RawIPRoute(*argv, **kwarg)

    The same as IPRoute, but does not use the netlink proxy. Thus it can not manage e.g. tun/tap interfaces.

    @@ -1246,36 +1269,105 @@ Thus it can not manage e.g. tun/tap inte

    Queueing disciplines

    drr

    -

    The qdisc doesn’t accept any parameters, but the class +

    The qdisc doesn’t accept any parameters, but the class accepts quantum parameter:

    -
    ip.tc('add', 'drr', interface, '1:')
    +
    ip.tc('add', 'drr', interface, '1:')
     ip.tc('add-class', 'drr', interface, '1:10', quantum=1600)
     ip.tc('add-class', 'drr', interface, '1:20', quantum=1600)
     
    +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_drr.options(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_drr.stats(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_drr.stats2(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +class stats_app(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +

    choke

    Parameters:

      -
    • limit (required) – int
    • -
    • bandwith (required) – str/int
    • -
    • min – int
    • -
    • max – int
    • -
    • avpkt – str/int, packet size
    • -
    • burst – int
    • -
    • probability – float
    • -
    • ecn – bool
    • +
    • limit (required) – int
    • +
    • bandwith (required) – str/int
    • +
    • min – int
    • +
    • max – int
    • +
    • avpkt – str/int, packet size
    • +
    • burst – int
    • +
    • probability – float
    • +
    • ecn – bool

    Example:

    -
    ip.tc('add', 'choke', interface,
    +
    ip.tc('add', 'choke', interface,
           limit=5500,
           bandwith="10mbit",
           ecn=True)
     
    +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_choke.options(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +class qopt(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +
    +class stab(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +encode()
    +

    Encode the message into the binary buffer:

    +
    msg.encode()
    +sock.send(msg.data)
    +
    +
    +

    If you want to customize the encoding process, override +the method:

    +
    class CustomMessage(nlmsg):
    +
    +    def encode(self):
    +        ...  # do some custom data tuning
    +        nlmsg.encode(self)
    +
    +
    +
    + +
    + +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_choke.stats(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_choke.stats2(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +class stats_app(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +

    clsact

    @@ -1286,7 +1378,7 @@ elsewhere) to direct the packet processi direct-action feature to specify what to do with each packet (pass, drop, redirect, etc.).

    BPF ingress/egress example using clsact qdisc:

    -
    # open_bpf_fd is outside the scope of pyroute2
    +
    # open_bpf_fd is outside the scope of pyroute2
     #fd = open_bpf_fd()
     eth0 = ip.get_links(ifname="eth0")[0]
     ip.tc("add", "clsact", eth0)
    @@ -1302,7 +1394,7 @@ drop, redirect, etc.).

    hfsc

    Simple HFSC example:

    -
    eth0 = ip.get_links(ifname="eth0")[0]
    +
    eth0 = ip.get_links(ifname="eth0")[0]
     ip.tc("add", "hfsc", eth0,
           handle="1:",
           default="1:1")
    @@ -1318,12 +1410,37 @@ drop, redirect, etc.).

  • fsc: link-share curve
  • usc: upper-limit curve
  • +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_hfsc.options_hfsc(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_hfsc.options_hfsc_class(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +class hfsc_curve(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_hfsc.stats2(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +class stats_app(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +

    htb

    TODO: list parameters

    An example with htb qdisc, lets assume eth0 == 2:

    -
    #          u32 -->    +--> htb 1:10 --> sfq 10:0
    +
    #          u32 -->    +--> htb 1:10 --> sfq 10:0
     #          |          |
     #          |          |
     # eth0 -- htb 1:0 -- htb 1:1
    @@ -1377,6 +1494,26 @@ drop, redirect, etc.).

    keys=["0x5/0xf+0", "0x10/0xff+33"])
    +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_htb.options(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    +class htb_glob(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    +
    +class htb_parms(data=None, offset=0, length=None, parent=None, init=None)
    +
    + +
    + +
    +
    +class pyroute2.netlink.rtnl.tcmsg.sched_htb.stats(data=None, offset=0, length=None, parent=None, init=None)
    +
    +
    @@ -1387,7 +1524,7 @@ drop, redirect, etc.).

    behavior when the filter matches. Currently the gact, bpf, and police action types are supported, and can be attached to the u32 and bpf filter types:

    -
    # An action can be a simple string, which translates to a gact type
    +
    # An action can be a simple string, which translates to a gact type
     action = "drop"
     
     # Or it can be an explicit type (these are equivalent)
    @@ -1448,15 +1585,14 @@ filter types:

    Table Of Contents

    @@ -1515,12 +1653,13 @@ filter types:

  • previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/ipset.html 0.5.2-1/docs/html/ipset.html --- 0.4.21-0.1/docs/html/ipset.html 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/docs/html/ipset.html 2018-06-19 08:31:09.000000000 +0000 @@ -0,0 +1,289 @@ + + + + + + + + IPSet module — pyroute2 0.5.2 documentation + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    IPSet module

    +
    +

    IPSet module

    +

    ipset support.

    +

    This module is tested with hash:ip, hash:net, list:set and several +other ipset structures (like hash:net,iface). There is no guarantee +that this module is working with all available ipset modules.

    +

    It supports almost all kernel commands (create, destroy, flush, +rename, swap, test…)

    +
    +
    +class pyroute2.ipset.IPSet(version=6, attr_revision=None, nfgen_family=2)
    +

    NFNetlink socket (family=NETLINK_NETFILTER).

    +

    Implements API to the ipset functionality.

    +
    +
    +add(name, entry, family=2, exclusive=True, comment=None, timeout=None, etype='ip', skbmark=None, skbprio=None, skbqueue=None, **kwargs)
    +

    Add a member to the ipset.

    +

    etype is the entry type that you add to the ipset. It’s related to +the ipset type. For example, use “ip” for one hash:ip or bitmap:ip +ipset.

    +

    When your ipset store a tuple, like “hash:net,iface”, you must use a +comma a separator (etype=”net,iface”)

    +

    entry is a string for “ip” and “net” objects. For ipset with several +dimensions, you must use a tuple (or a list) of objects.

    +

    “port” type is specific, since you can use integer of specialized +containers like PortEntry and PortRange

    +

    Examples:

    +
    ipset = IPSet()
    +ipset.create("foo", stype="hash:ip")
    +ipset.add("foo", "198.51.100.1", etype="ip")
    +
    +ipset = IPSet()
    +ipset.create("bar", stype="bitmap:port",
    +             bitmap_ports_range=(1000, 2000))
    +ipset.add("bar", 1001, etype="port")
    +ipset.add("bar", PortRange(1500, 2000), etype="port")
    +
    +ipset = IPSet()
    +import socket
    +protocol = socket.getprotobyname("tcp")
    +ipset.create("foobar", stype="hash:net,port")
    +port_entry = PortEntry(80, protocol=protocol)
    +ipset.add("foobar", ("198.51.100.0/24", port_entry),
    +          etype="net,port")
    +
    +
    +
    + +
    +
    +create(name, stype='hash:ip', family=2, exclusive=True, counters=False, comment=False, maxelem=65536, forceadd=False, hashsize=None, timeout=None, bitmap_ports_range=None, size=None, skbinfo=False)
    +

    Create an ipset name of type stype, by default +hash:ip.

    +

    Common ipset options are supported:

    +
      +
    • exclusive – if set, raise an error if the ipset exists
    • +
    • counters – enable data/packets counters
    • +
    • comment – enable comments capability
    • +
    • maxelem – max size of the ipset
    • +
    • forceadd – you should refer to the ipset manpage
    • +
    • hashsize – size of the hashtable (if any)
    • +
    • timeout – enable and set a default value for entries (if not None)
    • +
    • +
      bitmap_ports_range – set the specified inclusive portrange for
      +
      the bitmap ipset structure (0, 65536)
      +
      +
    • +
    • size – Size of the list:set, the default is 8
    • +
    • skbinfo – enable skbinfo capability
    • +
    +
    + +
    +
    +delete(name, entry, family=2, exclusive=True, etype='ip')
    +

    Delete a member from the ipset.

    +

    See add() method for more information on etype.

    +
    + +
    +
    +destroy(name=None)
    +

    Destroy one (when name is set) or all ipset (when name is None)

    +
    + +
    +
    +flush(name=None)
    +

    Flush all ipsets. When name is set, flush only this ipset.

    +
    + +
    +
    +get_supported_revisions(stype, family=2)
    +

    Return minimum and maximum of revisions supported by the kernel.

    +

    Each ipset module (like hash:net, hash:ip, etc) has several +revisions. Newer revisions often have more features or more +performances. Thanks to this call, you can ask the kernel +the list of supported revisions.

    +

    You can manually set/force revisions used in IPSet constructor.

    +

    Example:

    +
    ipset = IPSet()
    +ipset.get_supported_revisions("hash:net")
    +
    +ipset.get_supported_revisions("hash:net,port,net")
    +
    +
    +
    + +
    +
    +headers(name)
    +

    Get headers of the named ipset. It can be used to test if one ipset +exists, since it returns a no such file or directory.

    +
    + +
    +
    +list(*argv, **kwarg)
    +

    List installed ipsets. If name is provided, list +the named ipset or return an empty list.

    +

    Be warned: netlink does not return an error if given name does not +exit, you will receive an empty list.

    +
    + +
    +
    +rename(name_src, name_dst)
    +

    Rename the ipset.

    +
    + +
    +
    +swap(set_a, set_b)
    +

    Swap two ipsets. They must have compatible content type.

    +
    + +
    +
    +test(name, entry, family=2, etype='ip')
    +

    Test if entry is part of an ipset

    +

    See add() method for more information on etype.

    +
    + +
    + +
    +
    +class pyroute2.ipset.PortEntry(port, protocol=None)
    +

    A simple container for port entry with optional protocol

    +
    + +
    +
    +class pyroute2.ipset.PortRange(begin, end, protocol=None)
    +

    A simple container for port range with optional protocol

    +

    Note that optional protocol parameter is not supported by all +kernel ipset modules using ports. On the other hand, it’s sometimes +mandatory to set it (like for hash:net,port ipsets)

    +

    Example:

    +
    udp_proto = socket.getprotobyname("udp")
    +port_range = PortRange(1000, 2000, protocol=udp_proto)
    +ipset.create("foo", stype="hash:net,port")
    +ipset.add("foo", ("192.0.2.0/24", port_range), etype="net,port")
    +ipset.test("foo", ("192.0.2.0/24", port_range), etype="net,port")
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/makefile.html 0.5.2-1/docs/html/makefile.html --- 0.4.21-0.1/docs/html/makefile.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/makefile.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,37 +1,26 @@ + - + - - makefile documentation — pyroute2 0.4.21 documentation - + Makefile documentation — pyroute2 0.5.2 documentation - - + + - - - - + + + + +
    +
    @@ -55,7 +46,7 @@
    -

    makefile documentation

    +

    Makefile documentation

    Makefile is used to automate Pyroute2 deployment and test processes. Mostly, it is but a collection of common commands.

    @@ -67,37 +58,29 @@ collected coverage data, compiled byteco

    target: docs

    Build documentation. Requires sphinx.

    -
    -

    target: epydoc

    -

    Build API documentation. Requires epydoc.

    -

    Pls notice that epydoc is discontinued. The reason to support -it here is that it performs additional API testing and helps -to highlight API inconsistencies.

    -

    No issues regarding epydoc output format are accepted.

    -

    target: test

    Run tests against current code. Command line options:

      -
    • python – path to the Python to use
    • -
    • nosetests – path to nosetests to use
    • -
    • wlevel – the Python -W level
    • -
    • coverage – set coverage=html to get coverage report
    • -
    • pdb – set pdb=true to launch pdb on errors
    • -
    • module – run only specific test module
    • -
    • skip – skip tests by pattern
    • +
    • python – path to the Python to use
    • +
    • nosetests – path to nosetests to use
    • +
    • wlevel – the Python -W level
    • +
    • coverage – set coverage=html to get coverage report
    • +
    • pdb – set pdb=true to launch pdb on errors
    • +
    • module – run only specific test module
    • +
    • skip – skip tests by pattern

    To run the full test cycle on the project, using a specific python, making html coverage report:

    -
    $ sudo make test python=python3 coverage=html
    +
    $ sudo make test python=python3 coverage=html
     

    To run a specific test module:

    -
    $ sudo make test module=general:test_ipdb.py:TestExplicit
    +
    $ sudo make test module=general:test_ipdb.py:TestExplicit
     

    The module parameter syntax:

    -
    ## module=package[:test_file.py[:TestClass[.test_case]]]
    +
    ## module=package[:test_file.py[:TestClass[.test_case]]]
     
     $ sudo make test module=lnst
     $ sudo make test module=general:test_ipr.py
    @@ -106,40 +89,31 @@ $ sudo make test module=general:test_ipd
     

    There are several test packages:

      -
    • general – common functional tests
    • -
    • eventlet – Neutron compatibility tests
    • -
    • lnst – LNST compatibility tests
    • +
    • general – common functional tests
    • +
    • eventlet – Neutron compatibility tests
    • +
    • lnst – LNST compatibility tests

    For each package a new Python instance is launched, keep that in mind since it affects the code coverage collection.

    It is possible to skip tests by a pattern:

    -
    $ sudo make test skip=test_stress
    +
    $ sudo make test skip=test_stress
     
    -
    -

    target: test-ci

    -

    Run tests on isolated VMs defined by tests/ci/configs/*xml.

    -

    Requires qemu, kvm, libvirt and civm script: https://github.com/svinota/civm

    -

    Command line options:

    -
      -
    • civm – path to the civm script (if it is not in $PATH)
    • -
    -

    target: dist

    Make Python distribution package. Command line options:

      -
    • python – the Python to use
    • +
    • python – the Python to use

    target: install

    Build and install the package into the system. Command line options:

      -
    • python – the Python to use
    • -
    • root – root install directory
    • -
    • lib – where to install lib files
    • +
    • python – the Python to use
    • +
    • root – root install directory
    • +
    • lib – where to install lib files
    @@ -150,7 +124,7 @@ package directory will be visible to the can change the code locally and immediately test it system-wide without running make install.

      -
    • python – the Python to use
    • +
    • python – the Python to use
    @@ -168,12 +142,10 @@ or hooks for related projects. You can s

    Table Of Contents

    @@ -219,17 +193,18 @@ or hooks for related projects. You can s modules |
  • - next |
  • - previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/mpls.html 0.5.2-1/docs/html/mpls.html --- 0.4.21-0.1/docs/html/mpls.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/mpls.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - MPLS howto — pyroute2 0.4.21 documentation - + MPLS howto — pyroute2 0.5.2 documentation - - + + @@ -28,10 +18,9 @@ - - + + +
    +
    @@ -60,13 +51,13 @@
    • kernel >= 4.4
    • modules: mpls_router, mpls_iptunnel
    • -
    • $ sudo sysctl net.mpls.platform_labels=$x, where $x – number of labels
    • +
    • $ sudo sysctl net.mpls.platform_labels=$x, where $x – number of labels
    • pyroute2 >= 0.4.0

    MPLS labels

    Possible label formats:

    -
    # int
    +
    # int
     "dst": 20
     
     # list of ints
    @@ -77,7 +68,7 @@
     "labels": "20/30"
     
    -

    Any of these notations should be accepted by pyroute2, if not – try +

    Any of these notations should be accepted by pyroute2, if not – try another format and submit an issue to the project github page. The code is quite new, some issues are possible.

    Refer also to the test cases, there are many usage samples:

    @@ -91,7 +82,7 @@ is quite new, some issues are possible.<

    MPLS routes

    Label swap:

    -
    from pyroute2 import IPRoute
    +
    from pyroute2 import IPRoute
     from pyroute2.common import AF_MPLS
     
     ipr = IPRoute()
    @@ -107,7 +98,7 @@ is quite new, some issues are possible.<
     

    Notice, that dst is a single label, while newdst is a stack. Label push:

    -
    req = {"family": AF_MPLS,
    +
    req = {"family": AF_MPLS,
            "oif": idx,
            "dst": 20,
            "newdst": [20, 30]}
    @@ -115,7 +106,7 @@ is quite new, some issues are possible.<
     

    One can set up also the via field:

    -
    from socket import AF_INET
    +
    from socket import AF_INET
     
     req = {"family": AF_MPLS,
            "oif": idx,
    @@ -130,7 +121,7 @@ is quite new, some issues are possible.<
     

    MPLS lwtunnel

    To inject IP packets into MPLS:

    -
    req = {"dst": "1.2.3.0/24",
    +
    req = {"dst": "1.2.3.0/24",
            "oif": idx,
            "encap": {"type": "mpls",
                      "labels": [202, 303]}}
    @@ -144,8 +135,8 @@ is quite new, some issues are possible.<
     

    MPLS routes

    The IPDB database also supports MPLS routes, they are reflected in the -ipdb.routes.tables[“mpls”]:

    -
    >>> (ipdb
    +ipdb.routes.tables[“mpls”]:

    +
    >>> (ipdb
     ...  .routes
     ...  .add({"family": AF_MPLS,
     ...        "oif": ipdb.interfaces["eth0"]["index"],
    @@ -167,7 +158,7 @@ is quite new, some issues are possible.<
     

    Pls notice, that there is only one MPLS routing table.

    Multipath MPLS:

    -
    with IDPB() as ipdb:
    +
    with IDPB() as ipdb:
         (ipdb
          .routes
          .add({"family": AF_MPLS,
    @@ -187,7 +178,7 @@ is quite new, some issues are possible.<
     

    MPLS lwtunnel

    LWtunnel routes reside in common route tables:

    -
    with IPDB() as ipdb:
    +
    with IPDB() as ipdb:
         (ipdb
          .routes
          .add({"dst": "1.2.3.0/24",
    @@ -199,7 +190,7 @@ is quite new, some issues are possible.<
     

    Multipath MPLS lwtunnel:

    -
    with IPDB() as ipdb:
    +
    with IPDB() as ipdb:
         (ipdb
          .routes
          .add({"dst": "1.2.3.0/24",
    @@ -259,12 +250,14 @@ is quite new, some issues are possible.<
        
    @@ -286,12 +279,13 @@ is quite new, some issues are possible.<
  • previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/netlink.html 0.5.2-1/docs/html/netlink.html --- 0.4.21-0.1/docs/html/netlink.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/netlink.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - Netlink — pyroute2 0.4.21 documentation - + Netlink — pyroute2 0.5.2 documentation - - + + @@ -28,10 +18,9 @@ - - + + +
    +
    @@ -59,13 +50,13 @@

    basics

    General netlink packet structure:

    -
    nlmsg packet:
    +
    nlmsg packet:
         header
         data
     

    Generic netlink message header:

    -
    nlmsg header:
    +
    nlmsg header:
         uint32 length
         uint16 type
         uint16 flags
    @@ -76,10 +67,10 @@
     

    The length field is the length of all the packet, including data and header. The type field is used to distinguish different message types, commands etc. Please note, that there is no -explicit protocol field – you choose a netlink protocol, when +explicit protocol field – you choose a netlink protocol, when you create a socket.

    The sequence number is very important. Netlink is an asynchronous -protocol – it means, that the packet order doesn’t matter and is +protocol – it means, that the packet order doesn’t matter and is not guaranteed. But responses to a request are always marked with the same sequence number, so you can treat it as a cookie.

    Please keep in mind, that a netlink request can initiate a @@ -90,7 +81,7 @@ sysctl is set.

    Beside of incapsulated headers and other protocol-specific data, netlink messages can carry NLA (netlink attributes). NLA structure is as follows:

    -
    NLA header:
    +
    NLA header:
         uint16 length
         uint16 type
     NLA data:
    @@ -103,7 +94,7 @@ structure is as follows:

    So, NLA structures can be nested, forming a tree.

    Complete structure of a netlink packet:

    -
    nlmsg header:
    +
    nlmsg header:
         uint32 length
         uint16 type
         uint16 flags
    @@ -122,9 +113,9 @@ the man pages.

    packets

    To simplify the development, pyroute2 provides an easy way to describe packet structure. As an example, you can take the -ifaddrmsg description – pyroute2/netlink/rtnl/ifaddrmsg.py.

    +ifaddrmsg description – pyroute2/netlink/rtnl/ifaddrmsg.py.

    To describe a packet, you need to inherit from nlmsg class:

    -
    from pyroute2.netlink import nlmsg
    +
    from pyroute2.netlink import nlmsg
     
     class foo_msg(nlmsg):
         fields = ( ... )
    @@ -133,7 +124,7 @@ ifaddrmsg description – pyro
     

    NLA are described in the same way, but the parent class should be nla, instead of nlmsg. And yes, it is important to use the -proper parent class – it affects the header structure.

    +proper parent class – it affects the header structure.

    fields attribute

    @@ -142,7 +133,7 @@ protocol-specific data. It is a tuple of member contains a field name and its data format.

    Field data format should be specified as for Python struct module. E.g., ifaddrmsg structure:

    -
    struct ifaddrmsg {
    +
    struct ifaddrmsg {
         __u8  ifa_family;
         __u8  ifa_prefixlen;
         __u8  ifa_flags;
    @@ -152,7 +143,7 @@ module. E.g., ifaddrmsg structure:

    should be described as follows:

    -
    class ifaddrmsg(nlmsg):
    +
    class ifaddrmsg(nlmsg):
         fields = (('family', 'B'),
                   ('prefixlen', 'B'),
                   ('flags', 'B'),
    @@ -165,7 +156,7 @@ so you can use all the notations like pack attribute:

    -
    class tstats(nla):
    +
    class tstats(nla):
         pack = 'struct'
         fields = (('version', 'H'),
                   ('ac_exitcode', 'I'),
    @@ -174,8 +165,8 @@ use the pack attribute:

    Explicit padding bytes also can be used, when struct -packing doesn’t work well:

    -
    class ipq_mode_msg(nlmsg):
    +packing doesn’t work well:

    +
    class ipq_mode_msg(nlmsg):
         pack = 'struct'
         fields = (('value', 'B'),
                   ('__pad', '7x'),
    @@ -192,7 +183,7 @@ two fields, name and format, or three fi
     format.

    Please notice, that the format field is a string name of corresponding NLA class:

    -
    class ifaddrmsg(nlmsg):
    +
    class ifaddrmsg(nlmsg):
         ...
         nla_map = (('IFA_UNSPEC',  'hex'),
                    ('IFA_ADDRESS', 'ipaddr'),
    @@ -201,7 +192,7 @@ corresponding NLA class:

    This code will create mapping, where IFA_ADDRESS NLA will be of -type 1 and IFA_LOCAL – of type 2, etc. Both NLA will be decoded +type 1 and IFA_LOCAL – of type 2, etc. Both NLA will be decoded as IP addresses (class ipaddr). IFA_UNSPEC will be of type 0, and if it will be in the NLA tree, it will be just dumped in hex.

    NLA class names are should be specified as strings, since they @@ -210,32 +201,32 @@ are resolved in runtime.

    nla class:

      -
    • none – ignore this NLA
    • -
    • flag – boolean flag NLA (no payload; NLA exists = True)
    • -
    • uint8, uint16, uint32, uint64 – unsigned int
    • -
    • be8, be16, be32, be64 – big-endian unsigned int
    • -
    • ipaddr – IP address, IPv4 or IPv6
    • -
    • ip4addr – only IPv4 address type
    • -
    • ip6addr – only IPv6 address type
    • -
    • target – a univeral target (IPv4, IPv6, MPLS)
    • -
    • l2addr – MAC address
    • -
    • hex – hex dump as a string – useful for debugging
    • -
    • cdata – a binary data
    • -
    • string – UTF-8 string
    • -
    • asciiz – zero-terminated ASCII string, no decoding
    • -
    • array – array of simple types (uint8, uint16 etc.)
    • +
    • none – ignore this NLA
    • +
    • flag – boolean flag NLA (no payload; NLA exists = True)
    • +
    • uint8, uint16, uint32, uint64 – unsigned int
    • +
    • be8, be16, be32, be64 – big-endian unsigned int
    • +
    • ipaddr – IP address, IPv4 or IPv6
    • +
    • ip4addr – only IPv4 address type
    • +
    • ip6addr – only IPv6 address type
    • +
    • target – a univeral target (IPv4, IPv6, MPLS)
    • +
    • l2addr – MAC address
    • +
    • hex – hex dump as a string – useful for debugging
    • +
    • cdata – a binary data
    • +
    • string – UTF-8 string
    • +
    • asciiz – zero-terminated ASCII string, no decoding
    • +
    • array – array of simple types (uint8, uint16 etc.)

    Please refer to pyroute2/netlink/__init__.py for details.

    You can also make your own NLA descriptions:

    -
    class ifaddrmsg(nlmsg):
    +
    class ifaddrmsg(nlmsg):
         ...
         nla_map = (...
                    ('IFA_CACHEINFO', 'cacheinfo'),
                    ...)
     
         class cacheinfo(nla):
    -        fields = (('ifa_prefered', 'I'),
    +        fields = (('ifa_preferred', 'I'),
                       ('ifa_valid', 'I'),
                       ('cstamp', 'I'),
                       ('tstamp', 'I'))
    @@ -245,7 +236,7 @@ are resolved in runtime.

    where they are used.

    Also, it is possible to use not autogenerated type numbers, as for ifaddrmsg, but specify them explicitly:

    -
    class iw_event(nla):
    +
    class iw_event(nla):
         ...
         nla_map = ((0x8B00, 'SIOCSIWCOMMIT', 'hex'),
                    (0x8B01, 'SIOCGIWNAME', 'hex'),
    @@ -254,7 +245,7 @@ for ifaddrmsg, but specify them explicit
                    ...)
     
    -

    Here you can see custom NLA type numbers – 0x8B00, 0x8B01 etc. +

    Here you can see custom NLA type numbers – 0x8B00, 0x8B01 etc. It is not permitted to mix these two forms in one class: you should use ether autogenerated type numbers (two fields tuples), or explicit numbers (three fields typles).

    @@ -264,7 +255,7 @@ explicit numbers (three fields typles).<

    There are different array-like NLA types in the kernel, and some of them are covered by pyroute2. An array of simple type elements:

    -
    # declaration
    +
    # declaration
     nla_map = (('NLA_TYPE', 'array(uint8)'), ...)
     
     # data layout
    @@ -277,7 +268,7 @@ elements:

    An array of NLAs:

    -
    # declaration
    +
    # declaration
     nla_map = (('NLA_TYPE', '*type'), ...)
     
     # data layout
    @@ -295,7 +286,7 @@ elements:

    parsed netlink message

    Netlink messages are represented by pyroute2 as dictionaries as follows:

    -
    {'header': {'pid': ...,
    +
    {'header': {'pid': ...,
                 'length: ...,
                 'flags': ...,
                 'error': None,  # if you are lucky
    @@ -319,7 +310,7 @@ as follows:

    As an example, a message from the wireless subsystem about new scan event:

    -
    {'index': 4,
    +
    {'index': 4,
      'family': 0,
      '__align': 0,
      'header': {'pid': 0,
    @@ -339,9 +330,9 @@ scan event:

    One important detail is that NLA chain is represented as a list of -elements [‘NLA_TYPE’, value], not as a dictionary. The reason is that +elements [‘NLA_TYPE’, value], not as a dictionary. The reason is that though in the kernel usually NLA chain is a dictionary, the netlink -protocol by itself doesn’t require elements of each type to be unique. +protocol by itself doesn’t require elements of each type to be unique. In a message there may be several NLA of the same type.

    @@ -379,7 +370,7 @@ you really need it, it is simple as well

    The code:

    -
    from pyroute2.netlink import NLM_F_REQUEST
    +
    from pyroute2.netlink import NLM_F_REQUEST
     from pyroute2.netlink import NLM_F_ACK
     from pyroute2.netlink import NLM_F_CREATE
     from pyroute2.netlink import NLM_F_EXCL
    @@ -463,12 +454,14 @@ you really need it, it is simple as well
        
    @@ -490,12 +483,13 @@ you really need it, it is simple as well
  • previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/netns.html 0.5.2-1/docs/html/netns.html --- 0.4.21-0.1/docs/html/netns.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/netns.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,37 +1,26 @@ + - + - - Netns management overview — pyroute2 0.4.21 documentation - + Netns management overview — pyroute2 0.5.2 documentation - - + + - - - + + + +
    +
    @@ -57,7 +48,7 @@

    Netns management overview

    Pyroute2 provides basic namespaces management support. -Here’s a quick overview of typical netns tasks and +Here’s a quick overview of typical netns tasks and related pyroute2 tools.

    Move an interface to a namespace

    @@ -71,7 +62,7 @@ FD number, but a netns name as a string. the library will try to lookup the corresponding netns in the standard location.

    Create veth and move the peer to a netns with IPRoute:

    -
    from pyroute2 import IPRoute
    +
    from pyroute2 import IPRoute
     ipr = IPRoute()
     ipr.link('add', ifname='v0p0', kind='veth', peer='v0p1')
     idx = ipr.link_lookup(ifname='v0p1')[0]
    @@ -79,7 +70,7 @@ in the standard location.

    Create veth and move the peer to a netns with IPDB:

    -
    from pyroute2 import IPDB
    +
    from pyroute2 import IPDB
     ipdb = IPDB()
     ipdb.create(ifname='v0p0', kind='veth', peer='v0p1').commit()
     with ipdb.interfaces.v0p1 as i:
    @@ -92,14 +83,14 @@ in the standard location.

    This task can be done with NetNS objects. A NetNS object spawns a child and runs it within a netns, providing the same API as IPRoute does:

    -
    from pyroute2 import NetNS
    +
    from pyroute2 import NetNS
     ns = NetNS('netns_name')
     # do some stuff within the netns
     ns.close()
     

    One can even start IPDB on the top of NetNS:

    -
    from pyroute2 import NetNS
    +
    from pyroute2 import NetNS
     from pyroute2 import IPDB
     ipdb = IPDB(nl=NetNS('netns_name'))
     # do some stuff within the netns
    @@ -116,7 +107,7 @@ as normal Popen, but starts
     

    List, set, create and remove netns

    These functions are described below. To use them, import netns module:

    -
    from pyroute2 import netns
    +
    from pyroute2 import netns
     netns.listnetns()
     
    @@ -151,10 +142,12 @@ SELinux state with getenforce
      -
    • O_CREAT – create netns, if doesn’t exist
    • -
    • O_CREAT | O_EXCL – create only if doesn’t exist
    • +
    • O_CREAT – create netns, if doesn’t exist
    • +
    • O_CREAT | O_EXCL – create only if doesn’t exist
    +

    Changed in 0.5.1: the routine closes the ns fd if it’s +not provided via arguments.

    @@ -167,7 +160,7 @@ the required netns. All the netlink requ that proxy process.

    NetNS supports standard IPRoute API, so can be used instead of IPRoute, e.g., in IPDB:

    -
    # start the main network settings database:
    +
    # start the main network settings database:
     ipdb_main = IPDB()
     # start the same for a netns:
     ipdb_test = IPDB(nl=NetNS('test'))
    @@ -196,11 +189,11 @@ of IPRoute, e.g., in IPDB:

    Please review also the test code, under tests/test_netns.py for more examples.

    -

    By default, NetNS creates requested netns, if it doesn’t exist, +

    By default, NetNS creates requested netns, if it doesn’t exist, or uses existing one. To control this behaviour, one can use flags as for open(2) system call:

    -
    # create a new netns or fail, if it already exists
    -netns = NetNS('test', flags=os.O_CREAT | os.O_EXIST)
    +
    # create a new netns or fail, if it already exists
    +netns = NetNS('test', flags=os.O_CREAT | os.O_EXCL)
     
     # create a new netns or use existing one
     netns = NetNS('test', flags=os.O_CREAT)
    @@ -210,7 +203,7 @@ as for open(2) system call:
     

    To remove a network namespace:

    -
    from pyroute2 import NetNS
    +
    from pyroute2 import NetNS
     netns = NetNS('test')
     netns.close()
     netns.remove()
    @@ -237,7 +230,7 @@ poll/select as well.

    is mandatory to close the socket before exit.

    NetNS and IPDB

    It is possible to run IPDB with NetNS:

    -
    from pyroute2 import NetNS
    +
    from pyroute2 import NetNS
     from pyroute2 import IPDB
     
     ip = IPDB(nl=NetNS('somenetns'))
    @@ -255,46 +248,6 @@ down NetNS instance as well
     
     
     
    -
    -
    -pyroute2.netns.nslink.NetNServer(netns, cmdch, brdch, flags=64)
    -

    The netns server supposed to be started automatically by NetNS. -It has two communication channels: one simplex to forward incoming -netlink packets, rcvch, and other synchronous duplex to get -commands and send back responses, cmdch.

    -

    Channels should support standard socket API, should be compatible -with poll/select and should be able to transparently pickle objects. -NetNS uses multiprocessing.Pipe for this purpose, but it can be -any other implementation with compatible API.

    -

    The first parameter, netns, is a netns name. Depending on the -flags, the netns can be created automatically. The flags semantics -is exactly the same as for open(2) system call.

    -

    ...

    -

    The server workflow is simple. The startup sequence:

    -
    1. Create or open a netns.
    -
    -2. Start `IPRoute` instance. It will be used only on the low level,
    -   the `IPRoute` will not parse any packet.
    -
    -3. Start poll/select loop on `cmdch` and `IPRoute`.
    -
    -
    -

    On the startup, the server sends via cmdch the status packet. It can be -None if all is OK, or some exception.

    -

    Further data handling, depending on the channel, server side:

    -
    1. `IPRoute`: read an incoming netlink packet and send it unmodified
    -   to the peer via `rcvch`. The peer, polling `rcvch`, can handle
    -   the packet on its side.
    -
    -2. `cmdch`: read tuple (cmd, argv, kwarg). If the `cmd` starts with
    -   "send", then take `argv[0]` as a packet buffer, treat it as one
    -   netlink packet and substitute PID field (offset 12, uint32) with
    -   its own. Strictly speaking, it is not mandatory for modern netlink
    -   implementations, but it is required by the protocol standard.
    -
    -
    -
    -

    NSPopen

    @@ -306,7 +259,7 @@ namespace support.

    class pyroute2.netns.process.proxy.NSPopen(nsname, *argv, **kwarg)

    A proxy class to run Popen() object in some network namespace.

    Sample to run ip ad command in nsname network namespace:

    -
    nsp = NSPopen('nsname', ['ip', 'ad'], stdout=subprocess.PIPE)
    +
    nsp = NSPopen('nsname', ['ip', 'ad'], stdout=subprocess.PIPE)
     print(nsp.communicate())
     nsp.wait()
     nsp.release()
    @@ -321,13 +274,13 @@ process specified as the argument of the
     started in its turn from this child. Thus all the fd numbers
     of the running NSPopen object are meaningless in the context
     of the main process. Trying to operate on them, one will get
    -‘Bad file descriptor’ in the best case or a system call working
    +‘Bad file descriptor’ in the best case or a system call working
     on a wrong file descriptor in the worst case. A possible
     solution would be to transfer file descriptors between the
     NSPopen object and the main process, but it is not implemented
     yet.

    -

    The process’ diagram for NSPopen(‘test’, [‘ip’, ‘ad’]):

    -
    +---------------------+     +--------------+     +------------+
    +

    The process’ diagram for NSPopen(‘test’, [‘ip’, ‘ad’]):

    +
    +---------------------+     +--------------+     +------------+
     | main python process |<--->| child python |<--->| netns test |
     | NSPopen()           |     | Popen()      |     | $ ip ad    |
     +---------------------+     +--------------+     +------------+
    @@ -336,7 +289,7 @@ yet.

    As a workaround for the issue with file descriptors, some additional methods are available on file objects stdin, stdout and stderr. E.g., one can run fcntl calls:

    -
    from fcntl import F_GETFL
    +
    from fcntl import F_GETFL
     from pyroute2 import NSPopen
     from subprocess import PIPE
     
    @@ -380,8 +333,8 @@ the release() call.

    Previous topic

    -

    IPDB module

    +

    IPSet module

    Next topic

    MPLS howto

    @@ -394,12 +347,14 @@ the release() call.

    @@ -419,14 +374,15 @@ the release() call.

    next |
  • - previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/nlsocket.html 0.5.2-1/docs/html/nlsocket.html --- 0.4.21-0.1/docs/html/nlsocket.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/nlsocket.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,36 +1,25 @@ + - + - - Base netlink socket and marshal — pyroute2 0.4.21 documentation - + Base netlink socket and marshal — pyroute2 0.5.2 documentation - - + + - - + + +
    +
    @@ -59,14 +50,14 @@ poll/select I/O loops etc.

    asynchronous I/O

    To run async reader thread, one should call -NetlinkSocket.bind(async=True). In that case a -background thread will be launched. The thread will +NetlinkSocket.bind(async_cache=True). In that case +a background thread will be launched. The thread will automatically collect all the messages and store into a userspace buffer.

    Note

    There is no need to turn on async I/O, if you -don’t plan to receive broadcast messages.

    +don’t plan to receive broadcast messages.

    @@ -74,7 +65,7 @@ don’t plan to receive broadcast me

    When Netlink messages arrive faster than a program reads then from the socket, the messages overflow the socket buffer and one gets ENOBUF on recv():

    -
    ... self.recv(bufsize)
    +
    ... self.recv(bufsize)
     error: [Errno 105] No buffer space available
     
    @@ -86,7 +77,7 @@ spares CPU to read and enqueue arriving fast, as it is possible.

    With logging level DEBUG you can notice messages, that the library started to calm down the parser thread:

    -
    DEBUG:root:Packet burst: the reader thread priority
    +
    DEBUG:root:Packet burst: the reader thread priority
         is increased, beware of delays on netlink calls
         Counters: delta=25 qsize=25 delay=0.1
     
    @@ -95,14 +86,14 @@ the library started to calm down the par more attention. When the delay between messages on the parser thread exceeds 1 second, DEBUG messages become WARNING ones:

    -
    WARNING:root:Packet burst: the reader thread priority
    +
    WARNING:root:Packet burst: the reader thread priority
         is increased, beware of delays on netlink calls
         Counters: delta=2525 qsize=213536 delay=3
     

    This state means, that almost all the CPU resources are -dedicated to the reader thread. It doesn’t mean, that -the reader thread consumes 100% CPU – it means, that the +dedicated to the reader thread. It doesn’t mean, that +the reader thread consumes 100% CPU – it means, that the CPU is reserved for the case of more intensive bursts. The library will return to the normal state only when the broadcast storm will be over, and then the CPU will be @@ -110,20 +101,68 @@ broadcast storm will be over, and then t process all the messages queued so far.

    -

    when async I/O doesn’t help

    -

    Sometimes, even turning async I/O doesn’t fix ENOBUF. +

    when async I/O doesn’t help

    +

    Sometimes, even turning async I/O doesn’t fix ENOBUF. Mostly it means, that in this particular case the Python performance is not enough even to read and store the raw data from the socket. There is no workaround for such cases, except of using something not Python-based.

    One can still play around with SO_RCVBUF socket option, -but it doesn’t help much. So keep it in mind, and if you +but it doesn’t help much. So keep it in mind, and if you expect massive broadcast Netlink storms, perform stress testing prior to deploy a solution in the production.

    classes

    +
    +class pyroute2.netlink.nlsocket.BatchBacklog
    +
    + +
    +
    +class pyroute2.netlink.nlsocket.BatchBacklogQueue
    +
    +
    +append(*argv, **kwarg)
    +

    L.append(object) – append object to end

    +
    + +
    +
    +pop([index]) → item -- remove and return item at index (default last).
    +

    Raises IndexError if list is empty or index is out of range.

    +
    + +
    + +
    +
    +class pyroute2.netlink.nlsocket.BatchSocket(family=16, port=None, pid=None, fileno=None, sndbuf=1048576, rcvbuf=1048576, all_ns=False)
    +
    +
    +get(*argv, **kwarg)
    +

    Get parsed messages list. If msg_seq is given, return +only messages with that msg[‘header’][‘sequence_number’], +saving all other messages into self.backlog.

    +

    The routine is thread-safe.

    +

    The bufsize parameter can be:

    +
    +
      +
    • +
      -1: bufsize will be calculated from the first 4 bytes of
      +
      the network data
      +
      +
    • +
    • 0: bufsize will be calculated from SO_RCVBUF sockopt
    • +
    • int >= 0: just a bufsize
    • +
    +
    +
    + +
    + +
    class pyroute2.netlink.nlsocket.Marshal

    Generic marshalling class

    @@ -140,13 +179,13 @@ not support any defragmentation on that
    -class pyroute2.netlink.nlsocket.NetlinkMixin(family=16, port=None, pid=None, fileno=None, all_ns=False)
    +class pyroute2.netlink.nlsocket.NetlinkMixin(family=16, port=None, pid=None, fileno=None, sndbuf=1048576, rcvbuf=1048576, all_ns=False)

    Generic netlink socket

    get(bufsize=16384, msg_seq=0, terminate=None, callback=None)

    Get parsed messages list. If msg_seq is given, return -only messages with that msg[‘header’][‘sequence_number’], +only messages with that msg[‘header’][‘sequence_number’], saving all other messages into self.backlog.

    The routine is thread-safe.

    The bufsize parameter can be:

    @@ -178,16 +217,16 @@ or a list of ints. Always return diction the socket. Parameters:

      -
    • msg – the message in the dictionary format
    • -
    • msg_type – the message type
    • -
    • msg_flags – the message flags to use in the request
    • -
    • addr – sendto() addr, default (0, 0)
    • -
    • msg_seq – sequence number to use
    • -
    • msg_pid – pid to use, if None – use os.getpid()
    • +
    • msg – the message in the dictionary format
    • +
    • msg_type – the message type
    • +
    • msg_flags – the message flags to use in the request
    • +
    • addr – sendto() addr, default (0, 0)
    • +
    • msg_seq – sequence number to use
    • +
    • msg_pid – pid to use, if None – use os.getpid()

    Example:

    -
    s = IPRSocket()
    +
    s = IPRSocket()
     s.bind()
     s.put({'index': 1}, RTM_GETLINK)
     s.get()
    @@ -196,8 +235,8 @@ the socket. Parameters:

    Please notice, that the return value of s.get() can be not the result of s.put(), but any broadcast message. -To fix that, use msg_seq – the response must contain the -same msg[‘header’][‘sequence_number’] value.

    +To fix that, use msg_seq – the response must contain the +same msg[‘header’][‘sequence_number’] value.

    @@ -210,7 +249,7 @@ callable object, that returns True or Fa the callback will be called. Upon False it will not. Args is a list or tuple of arguments.

    Simplest example, assume ipr is the IPRoute() instance:

    -
    # create a simplest callback that will print messages
    +
    # create a simplest callback that will print messages
     def cb(msg):
         print(msg)
     
    @@ -219,7 +258,7 @@ Args is a list or tuple of arguments.

    More complex example, with filtering:

    -
    # Set object's attribute after the message key
    +
    # Set object's attribute after the message key
     def cb(msg, obj):
         obj.some_attr = msg["some key"]
     
    @@ -244,7 +283,7 @@ to register one particular rule, or
     nlsocket.register_policy({MSG_ID1: msg_class})
     to register several rules at once.
     E.g.:

    -
    policy = {RTM_NEWLINK: ifinfmsg,
    +
    policy = {RTM_NEWLINK: ifinfmsg,
               RTM_DELLINK: ifinfmsg,
               RTM_NEWADDR: ifaddrmsg,
               RTM_DELADDR: ifaddrmsg}
    @@ -252,7 +291,7 @@ E.g.:

    One can call register_policy() as many times, -as one want to – it will just extend the current +as one want to – it will just extend the current policy scheme, not replace it.

    @@ -269,9 +308,9 @@ register

    Unregister policy. Policy can be:

      -
    • int – then it will just remove one policy
    • -
    • list or tuple of ints – remove all given
    • -
    • dict – remove policies by keys from dict
    • +
    • int – then it will just remove one policy
    • +
    • list or tuple of ints – remove all given
    • +
    • dict – remove policies by keys from dict

    In the last case the routine will ignore dict values, @@ -281,6 +320,31 @@ it is implemented so just to make it com

    +
    +
    +class pyroute2.netlink.nlsocket.NetlinkSocket(family=16, port=None, pid=None, fileno=None, sndbuf=1048576, rcvbuf=1048576, all_ns=False)
    +
    +
    +bind(groups=0, pid=None, **kwarg)
    +

    Bind the socket to given multicast groups, using +given pid.

    +
    +
      +
    • If pid is None, use automatic port allocation
    • +
    • If pid == 0, use process’ pid
    • +
    • If pid == <int>, use the value instead of pid
    • +
    +
    +
    + +
    +
    +close()
    +

    Correctly close the socket and free all resources.

    +
    + +
    +
    @@ -295,7 +359,7 @@ it is implemented so just to make it com
  • Base netlink socket and marshal
  • @@ -313,12 +377,14 @@ it is implemented so just to make it com
    @@ -337,12 +403,13 @@ it is implemented so just to make it com
  • previous |
  • - + +
    \ No newline at end of file Binary files 0.4.21-0.1/docs/html/objects.inv and 0.5.2-1/docs/html/objects.inv differ diff -pruN 0.4.21-0.1/docs/html/py-modindex.html 0.5.2-1/docs/html/py-modindex.html --- 0.4.21-0.1/docs/html/py-modindex.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/py-modindex.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - Python Module Index — pyroute2 0.4.21 documentation - + Python Module Index — pyroute2 0.5.2 documentation - - + + @@ -29,10 +19,9 @@ - - + + +
    +
    @@ -89,7 +80,17 @@     - pyroute2.ipset + pyroute2.iproute.bsd + + + +     + pyroute2.iproute.linux + + + +     + pyroute2.ipset @@ -151,6 +152,11 @@     pyroute2.netns.process.proxy + + +     + pyroute2.wiset + @@ -161,12 +167,14 @@
    @@ -182,12 +190,13 @@
  • modules |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/report.html 0.5.2-1/docs/html/report.html --- 0.4.21-0.1/docs/html/report.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/report.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,37 +1,26 @@ + - + - - report a bug — pyroute2 0.4.21 documentation - + Report a bug — pyroute2 0.5.2 documentation - - + + - - - + + + +
    +
    @@ -55,7 +46,7 @@
    -

    report a bug

    +

    Report a bug

    In the case you have issues, please report them to the project bug tracker: https://github.com/svinota/pyroute2/issues

    It is important to provide all the required information @@ -63,17 +54,17 @@ with your report:

    • Linux kernel version
    • Python version
    • -
    • Specific environment, if used – gevent, eventlet etc.
    • +
    • Specific environment, if used – gevent, eventlet etc.

    Sometimes it is needed to measure specific system parameters. There is a code to do that, e.g.:

    -
    $ sudo make test-platform
    +
    $ sudo make test-platform
     

    Please keep in mind, that this command will try to create and delete different interface types.

    It is possible also to run the test in your code:

    -
    from pprint import pprint
    +
    from pprint import pprint
     from pyroute2.config.test_platform import TestCapsRtnl
     pprint(TestCapsRtnl().collect())
     
    @@ -88,7 +79,7 @@ and delete different interface types.

    Previous topic

    makefile documentation

    + title="previous chapter">Makefile documentation

    Next topic

    Quickstart

    @@ -101,12 +92,14 @@ and delete different interface types.

    @@ -126,14 +119,15 @@ and delete different interface types.

    next |
  • - previous |
  • - + +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/search.html 0.5.2-1/docs/html/search.html --- 0.4.21-0.1/docs/html/search.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/search.html 2018-06-19 08:31:09.000000000 +0000 @@ -1,26 +1,16 @@ + - + - - Search — pyroute2 0.4.21 documentation - + Search — pyroute2 0.5.2 documentation - - + + @@ -34,10 +24,9 @@ - - + + +
    +
    \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/searchindex.js 0.5.2-1/docs/html/searchindex.js --- 0.4.21-0.1/docs/html/searchindex.js 2017-09-01 19:37:26.000000000 +0000 +++ 0.5.2-1/docs/html/searchindex.js 2018-06-19 08:31:09.000000000 +0000 @@ -1 +1 @@ -Search.setIndex({docnames:["arch","changelog","debug","devcontribute","devgeneral","devmodules","dhcp","general","index","ipdb","iproute","makefile","mpls","netlink","netns","nlsocket","report","sm-interfaces","usage"],envversion:50,filenames:["arch.rst","changelog.rst","debug.rst","devcontribute.rst","devgeneral.rst","devmodules.rst","dhcp.rst","general.rst","index.rst","ipdb.rst","iproute.rst","makefile.rst","mpls.rst","netlink.rst","netns.rst","nlsocket.rst","report.rst","sm-interfaces.rst","usage.rst"],objects:{"pyroute2.dhcp":{dhcp4socket:[6,0,0,"-"]},"pyroute2.dhcp.dhcp4socket":{DHCP4Socket:[6,1,1,""]},"pyroute2.dhcp.dhcp4socket.DHCP4Socket":{get:[6,2,1,""],put:[6,2,1,""]},"pyroute2.ipdb":{main:[9,0,0,"-"]},"pyroute2.ipdb.main":{IPDB:[9,1,1,""]},"pyroute2.ipdb.main.IPDB":{register_callback:[9,2,1,""],release:[9,2,1,""]},"pyroute2.iproute":{IPBatch:[10,1,1,""],IPRoute:[10,1,1,""],IPRouteMixin:[10,1,1,""],RawIPRoute:[10,1,1,""]},"pyroute2.iproute.IPRouteMixin":{addr:[10,2,1,""],brport:[10,2,1,""],fdb:[10,2,1,""],flush_addr:[10,2,1,""],flush_routes:[10,2,1,""],flush_rules:[10,2,1,""],get_addr:[10,2,1,""],get_classes:[10,2,1,""],get_default_routes:[10,2,1,""],get_filters:[10,2,1,""],get_links:[10,2,1,""],get_neighbors:[10,2,1,""],get_neighbours:[10,2,1,""],get_ntables:[10,2,1,""],get_qdiscs:[10,2,1,""],get_routes:[10,2,1,""],get_rules:[10,2,1,""],get_vlans:[10,2,1,""],link:[10,2,1,""],link_lookup:[10,2,1,""],neigh:[10,2,1,""],route:[10,2,1,""],rule:[10,2,1,""],tc:[10,2,1,""],vlan_filter:[10,2,1,""]},"pyroute2.ipset":{IPSet:[5,1,1,""]},"pyroute2.ipset.IPSet":{"delete":[5,2,1,""],add:[5,2,1,""],create:[5,2,1,""],destroy:[5,2,1,""],flush:[5,2,1,""],get_supported_revisions:[5,2,1,""],headers:[5,2,1,""],list:[5,2,1,""],rename:[5,2,1,""],swap:[5,2,1,""],test:[5,2,1,""]},"pyroute2.netlink":{nlsocket:[15,0,0,"-"]},"pyroute2.netlink.nlsocket":{Marshal:[15,1,1,""],NetlinkMixin:[15,1,1,""]},"pyroute2.netlink.nlsocket.Marshal":{parse:[15,2,1,""]},"pyroute2.netlink.nlsocket.NetlinkMixin":{get:[15,2,1,""],get_policy_map:[15,2,1,""],put:[15,2,1,""],register_callback:[15,2,1,""],register_policy:[15,2,1,""],unregister_callback:[15,2,1,""],unregister_policy:[15,2,1,""]},"pyroute2.netlink.rtnl.tcmsg":{cls_u32:[10,0,0,"-"],sched_choke:[10,0,0,"-"],sched_clsact:[10,0,0,"-"],sched_drr:[10,0,0,"-"],sched_hfsc:[10,0,0,"-"],sched_htb:[10,0,0,"-"]},"pyroute2.netns":{create:[14,3,1,""],listnetns:[14,3,1,""],nslink:[14,0,0,"-"],remove:[14,3,1,""],setns:[14,3,1,""]},"pyroute2.netns.nslink":{NetNS:[14,1,1,""],NetNServer:[14,3,1,""]},"pyroute2.netns.nslink.NetNS":{remove:[14,2,1,""]},"pyroute2.netns.process":{proxy:[14,0,0,"-"]},"pyroute2.netns.process.proxy":{NSPopen:[14,1,1,""]},"pyroute2.netns.process.proxy.NSPopen":{release:[14,2,1,""]},pyroute2:{dhcp:[6,0,0,"-"],iproute:[10,0,0,"-"],ipset:[5,0,0,"-"],iwutil:[5,0,0,"-"],netlink:[13,0,0,"-"],netns:[14,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"0ce40d31d937":9,"0x0":10,"0x0000":10,"0x0006":10,"0x00ff":10,"0x1":10,"0x10":10,"0x10000":10,"0x100000":10,"0x10001":10,"0x10010":10,"0x10020":10,"0x2":10,"0x20":10,"0x200":7,"0x200000":10,"0x300":7,"0x4":10,"0x5":10,"0x8":10,"0x8100":10,"0x88a8":10,"0x8b00":13,"0x8b01":13,"0x8b02":13,"0x8b03":13,"0xa":10,"0xc0a80000":10,"0xc0a80001":10,"0xc0a800010":10,"0xf":10,"0xff":10,"0xff0000":10,"0xffc0":10,"0xffff0000":10,"0xffff0001":10,"0xffffff00":10,"0xffffffff":10,"10kbit":10,"10mbit":10,"128kbit":10,"12x":13,"16byte":1,"16s":13,"192kbit":10,"1ad":[1,10],"256kbit":10,"2b7":17,"2nd":10,"32bit":1,"3rd":[7,10],"4c8":9,"4kl":17,"59e":17,"5mbit":10,"6\u04bfq":17,"7a637a44":9,"7fm":17,"\u0140":17,"\u01b4":17,"\u01be":17,"\u01d21":17,"\u0203v":17,"\u0213":17,"\u022f":17,"\u024bd\u04b5y":17,"\u0254n":17,"\u02635":17,"\u027d":17,"\u02aa":17,"\u0377":17,"\u03b0":17,"\u03cd":17,"\u03df":17,"\u0431":17,"\u043e":17,"\u046b":17,"\u047b":17,"\u04a5":17,"\u04b54":17,"\u04d5":17,"\u0581":17,"\u062di":17,"\u0630":17,"\u0643":17,"\u06a7b":17,"\u06ab":17,"\u06c6x":17,"\u06cb_i":17,"\u06d0":17,"\u06ef":17,"\u07246":17,"\u0756c":17,"\u07a1":17,"\u373fb":17,"\u8359":17,"\u8360":17,"\ub4d4":17,"\ud064y":17,"\ud147":17,"b8y\uac39":17,"boolean":13,"break":[1,3],"byte":[6,10,13,15],"case":[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16],"catch":9,"class":[0,1,2,5,6,7,8,10,13,14,18],"default":[1,2,5,6,10,14,15],"export":[1,2,4,5,18],"float":10,"function":[1,4,5,6,7,9,10,11,14,15,18],"gn\u02cd":17,"import":[0,1,2,7,8,9,10,12,13,14,16],"int":[2,4,9,10,12,13,15],"j3\u06a0\u0584":17,"kn\u01fb3":17,"long":[9,10],"m\u0288y":17,"new":[1,9,10,11,12,13,14,18],"null":2,"nw\u043bm":17,"public":[0,1,10,18],"r\u4fb7pc":17,"return":[0,1,4,5,6,9,10,15],"short":[1,9,12],"static":10,"tg\ub312":17,"throw":1,"tn\u00f8izj":17,"true":[0,1,5,9,10,11,13,15],"try":[6,9,12,14,16,18],"veaj\u06e6":17,"vo\ub033":17,"while":[0,9,10,12],And:[10,13],Being:18,But:[0,4,5,6,9,13,18],For:[0,2,5,10,11,14],Hds:17,IPs:1,OVS:1,One:[4,6,9,10,12,13,14,15,18],Pls:[2,5,7,10,11,12],TLS:1,The:[0,2,3,4,5,6,7,8,10,11,12,13,14,15,18],Then:[5,15],There:[0,2,5,6,7,9,10,11,13,15,16,18],These:[0,9,10,14],Use:[2,10],Uses:10,Using:[9,13],VMs:[1,11],Will:[5,10],With:[5,7,10,15],__align:[10,13],__exit__:9,__init__:[4,5,13,18],__pad:13,__u32:13,__u8:13,_rproxi:0,_sproxi:0,a4c1:17,abil:10,abl:14,about:[3,8,9,13],abov:[2,6,9,10,13,14],absolut:1,ac_exitcod:13,ac_flag:13,accept:[0,6,9,10,11,12],access:[1,7,9,10,14],accord:[6,10],acess:9,achtung:1,acpi:7,acpi_ev:[1,7],act:[9,10],action:[1,9,10,15],activ:[9,15],actual:[4,7,9,10],add:[1,2,5,7,9,10,12,13,14],add_ip:[7,9,14],add_nh:9,add_port:[7,9],added:[1,6,9],addit:[7,9,10,11,14],addr:[1,2,7,9,10,12,13,15],address:[1,2,4,6,7,8,10,13,14],addrpool:1,administr:6,adt:1,advmss:9,af_bridg:10,af_inet6:[9,10],af_inet:[7,9,10,12,13],af_mpl:[1,7,12],af_netlink:[2,4,5],af_spec:10,affect:[0,10,11,13,18],after:[9,10,14,15],again:9,against:11,ageing:9,agnost:[0,10],aim:7,algo:4,algorithm:10,alia:10,alias:6,alignemt:13,all:[1,2,4,5,6,7,9,10,13,14,15,16,18],all_n:[10,15],alloc:1,allow:[0,1,4,5,7,9,10],almost:[5,9,10,15],alpha:1,alreadi:[0,6,10,14],also:[1,2,4,5,6,9,10,12,13,14,15,16,18],alwai:[2,10,13,15],analysi:6,android:[1,9],angu:1,ani:[0,1,2,4,5,6,9,10,12,14,15,18],anoth:[0,2,9,10,12,14,18],anymor:[2,9],anyth:9,anywai:2,apach:1,api:[0,1,4,5,7,8,11,14,15,18],appear:9,append:10,appli:[9,10],approach:[9,10,18],arch:[1,7],architectur:[1,8,14],arg:15,argument:[2,9,10,14,15],argv:[5,10,14],armv6l:1,armv7l:1,around:15,arp:[9,10],arrai:6,array8:6,arriv:[0,9,15],asap:0,ascii:13,asciiz:13,ask:9,assign:14,assum:[0,9,10,15],async:[0,4,8,9,10],asynchron:[0,8,9,10,13],asyncio:1,asyncron:9,attach:[2,10,13],attent:15,attr:[5,9,10,13],attr_revis:5,attribut:[1,6,9,10,15],auth:1,authomat:9,autocomplet:2,autodoc:1,autogener:13,autom:11,automat:[7,9,10,14,15],avail:[5,9,10,14,15,18],avoid:[9,15],avpkt:10,awar:14,b5e7:9,back:[1,7,9,10,14],background:[9,14,15],backlog:15,bad:14,bala:[9,10],bandwith:10,base:[1,4,8,9,10,18],bash:[2,10],basi:9,basic:[1,4,5,6,7,8,9,14],batch:[2,10],batchsocket:[0,2],bc4_:17,be16:[6,13],be32:[4,13],be64:13,be8:13,becaus:9,becom:[0,9,15],been:[9,10],befor:[7,9,10,14,15],begin:9,behav:[0,18],behavior:10,behaviour:[0,9,10,14],behind:0,being:[2,14],believ:10,below:[9,10,14],benchmark:1,besid:[0,7,13],best:14,better:[9,10],between:[1,5,9,14,15,18],bewar:15,big:[6,13],binari:[0,2,5,10,13],bind:[0,2,4,6,7,10,15,18],bit:[4,6,7,9,10,13],bitmap:5,bl2:17,blackhol:10,block:[1,7,9],bodi:10,bond:[1,9,10],bool:10,boot:10,bootp:6,bootrequest:6,bos:10,both:[1,9,10,13,18],bound:1,bpf:[1,6,10],br0:10,br0v500:10,br_:9,br_ageing_tim:9,br_forward_delai:9,brace:5,branch:10,brdch:14,brentri:10,bridg:[1,7,8,10],bring:[7,9,10],broadcast:[1,2,7,9,10,15,18],broken:1,brport:[1,10],brport_cost:9,brport_proxyarp:9,brport_unicast_flood:9,brx:10,bss:1,buf:0,buffer:[1,2,10,13,14,15],bufsiz:15,bug:[1,4,5,7,8],build:11,built:[4,11],bump:1,bundl:1,burst:[0,9,10,15],bytecod:11,c9y:17,cach:[9,10],cacheinfo:13,calcul:15,call:[0,1,2,7,9,10,14,15,18],callabl:[1,15],callback:[0,1,9,15],calm:15,can:[0,2,3,4,5,6,7,9,10,11,12,13,14,15,18],candi:9,capabl:[1,5],carefulli:10,carri:13,cascad:[1,13],cat:10,cau:17,caus:[0,2,9,10,18],cdata:13,cento:1,chaddr:6,chain:[1,10,13],chang:[1,4,7,9,10,11,13,18],changelog:8,channel:14,chantra:1,chapter:18,charact:10,cheaper:9,check:[4,9,14],child:14,choic:9,choke:1,choos:[0,1,10,13],civm:[1,11],classid:10,classifi:10,classless:10,clean:8,cleanup:1,clear:14,cli:5,client:[0,1],client_id:6,clone:2,close:[0,1,4,7,14,15,18],clsact:1,cmd:[5,14],cmdch:14,code:[0,1,3,4,6,9,10,11,12,13,14,16,18],codel:1,collect:[0,2,4,5,11,15,16,18],com:[3,5,7,9,11,16],combin:2,come:[0,5],comma:5,command:[1,2,5,9,10,11,13,14,16],comment:[2,5],commit:[0,1,7,9,10,12,14,18],common:[1,2,5,11,12],commun:[1,14],compar:9,comparison:1,compat:[0,1,6,8,11,14,15],compil:[1,8,10,11],complement:1,complet:[0,1,5,6,9,10,13],complex:15,compli:3,complic:[0,6,9],compon:1,con:9,condit:9,config:[1,11,16,18],configur:[7,10],conflict:[9,18],confus:10,connect:[0,4],connmark:1,consist:[1,4,5,9],constant:10,construct:[6,7,13,15],constructor:18,consum:15,consumpt:1,contain:[6,7,9,10,13,15,18],content:10,context:[1,6,8,14],continu:9,contribut:[8,10],control:[1,5,7,9,10,14],cooki:13,cope:[9,10],copi:[1,2,4,5],copyright:2,core:[4,14],correct:[1,18],correctli:[1,9],correspond:[0,5,6,9,13,14],cost:[9,10],count:10,counter:[1,5,15],cours:0,cover:[1,5,13],coverag:[1,7,11],cpu:[9,10,15],creat:[0,1,2,5,7,8,10,12,15,16,18],creation:[1,9,10],credit:2,critic:1,cstamp:13,ctrl:10,ctrlmsg:0,ctype:[3,14],current:[10,11,14,15],current_tx:9,curv:10,custom:[0,1,4,6,10,13],custom_socket_bas:4,cycl:[1,10,11],daemon:9,data:[0,1,4,5,8,10,11,13,14,15,18],databas:[4,9,10,12,14],date:9,deal:10,dealloc:1,debug:[1,5,8,13,15],declar:[1,13],decod:[0,1,4,5,6,7,8,15],dedic:[0,1,9,15],deepcopi:1,def:[4,10,15,18],defer:18,defin:[2,4,5,6,9,11,13],definit:[5,6,10],defragment:[1,15],del:[9,10],del_ip:9,del_nh:9,del_port:9,delai:[9,15],delet:[1,5,9,10,16],delta:[1,15],demand:[1,10],deni:5,depend:[1,2,9,10,14],deploi:[11,15],deploy:11,deprec:[1,10,15],deriv:15,describ:[4,6,7,13,14],descript:[6,10,13],descriptor:14,design:9,destin:[1,9,10],destroi:[5,10],destruct:1,detail:[3,6,7,9,10,13],dev:[1,2,7,10],develop:[1,4,5,6,9,13,18],devic:[1,7,9,10,15,18],devlink:[1,7],dhcp4msg:[0,6],dhcp4socket:6,dhcp:[0,1],dhcpdiscov:6,dhcpmsg:0,dhcprequest:6,dhcpv4:1,diagnost:1,diagram:[0,1,14],dict:[4,9,10,15],dictionari:[0,6,9,10,13,15],differ:[0,1,2,4,7,13,14,16],dir:9,direct:[1,10],direct_act:10,directli:[9,13,18],directori:[4,5,11],disabl:1,disciplin:8,discontinu:11,discov:7,discoveri:[5,7],disk:7,displai:2,dist:8,distinguish:13,distribut:11,doc:[1,4,7,8,9],document:[1,4,7,8,10],doe:[0,5,6,9,10,14],doesn:[0,1,2,8,9,10,13,14],don:[5,7,15],done:[0,6,9,14,18],dot:2,down:[1,9,10,14,15],dport:6,dquotsocket:7,draft:1,driver:10,drop:[1,9,10,14],drr:1,dst:[7,9,10,12],dst_len:10,dual:1,due:[2,18],dummi:[1,2,10,18],dummy0:10,dump:[1,4,5,8,10,13,14],duplex:14,dure:[1,9],each:[10,11,13],earli:5,easi:[4,9,13],easier:9,easiest:2,ecn:10,eexist:1,effect:9,egg:11,egress:10,eht0:10,either:[2,9,10,11,13,15],element:13,els:[9,10,18],elsewher:10,em1:[7,10],em2:7,emb:1,embed:1,emerg:18,empti:[1,5,10,13],enabl:[4,5,7],encap:[1,7,10,12],encod:[0,1,6,7,15],end:[2,6,7,9,13],endian:[6,13],enforc:14,engin:5,enobuf:8,enough:[4,5,9,15,18],enqueu:15,ensur:9,entiti:10,entri:5,environ:[16,18],epydoc:8,equal:[9,10],equival:10,ericsson:1,errno:[1,15],error:[0,1,5,7,9,10,11,13,15,18],establish:0,etc:[0,2,4,6,9,10,11,13,15,16],eth0:[9,10,12],eth1:[9,10,12],eth2:[9,10],eth:[9,10],eth_p_al:10,ether:13,ethmsg:0,etyp:5,even:[2,5,9,10,14,15],event:[1,7,9,10,13],eventlet:[1,4,8,11,16],eventlet_config:18,everi:[4,6,9,10,13],evolv:5,exactli:[0,14],exampl:[1,2,4,5,6,7,9,10,13,14,15],exce:15,except:[0,1,5,6,7,8,9,10,14,15],exclus:[5,9,18],execut:9,exist:[1,5,9,10,13,14],exit:[2,5,7,9,14],expect:[9,10,15],experi:9,experiment:5,explicit:[9,10,13],explicitli:[1,9,10,13,14],extend:[0,6,7,15],extern:[0,9,10],extra:0,extrem:5,eye:9,f_getfl:14,fact:4,fail:[1,9,10,14],fals:[5,9,10,15],famili:[1,5,7,9,10,12,13,15],familiar:5,far:[5,6,9,15],fast:15,faster:15,fbbpk:17,fcntl:14,fdb:[1,10],fe80:9,featur:[0,4,9,10],fedora:1,fetch:10,fff2:10,fff3:10,ffff:10,fibmsg:[0,10],field:[0,1,9,10,12,14],field_name1:13,field_namex:13,file:[1,2,4,5,10,11,14,18],fileno:[0,10,15],fill:13,filter:[1,6,7,8,9,15],find:[5,6,9,13],first:[1,5,6,9,10,14,15,18],fit:6,fix:[1,4,6,9,13,15],fix_messag:4,flag:[1,2,5,9,10,13,14,15],flake8:[3,7],flat:1,flock:14,flood:9,flush:[5,10],flush_addr:[1,10],flush_rout:[1,10],flush_rul:[1,10],fly:18,follow:[2,5,6,9,10,13],foo:10,foo_msg:13,forc:9,forceadd:5,forget:[4,7,9,14,18],fork:1,form:[2,9,10,13],format:[2,4,6,9,11,12,13,15],forum:7,forward:[0,1,9,10,14],found:4,four:[9,10],fq_codel:1,fr_act_nop:10,fr_act_unreach:10,frame:18,framework:[0,4,6,7],freez:[1,9],freq_fix:1,friendli:[2,4],from:[0,1,2,4,5,6,7,10,11,12,13,14,15,16,18],fsc:10,full:[1,5,9,10,11,14],fun:10,further:[6,14],futur:9,fwmark:[1,10],gact:10,gatewai:[7,9,10,12],gcc:2,gener:[0,1,4,5,6,7,11,12,13,15],genericnetlinksocket:0,genl:1,genlmsg:[0,4],get:[0,1,5,6,7,10,11,12,13,14,15,18],get_addr:10,get_attr:10,get_class:10,get_default_rout:10,get_filt:10,get_link:[0,7,10,18],get_neighbor:10,get_neighbour:10,get_ntabl:10,get_policy_map:15,get_qdisc:10,get_rout:[10,18],get_rul:10,get_supported_revis:5,get_vlan:[1,10],getenforc:14,getpid:[13,15],getsocknam:[2,4],getsockopt:15,getvalu:0,gevent:16,gid:10,git:2,github:[3,4,5,7,9,11,12,16],give:9,given:[5,6,15],gix:17,global:1,going:[0,5],googl:7,gplv2:1,gre:10,gre_iflag:10,gre_ikei:10,gre_loc:10,gre_oflag:10,gre_okei:10,gre_remot:10,gre_ttl:10,gretap:1,grex:10,group:[1,2,4,6,7],gtp:1,guarante:[0,5,13],guard:18,gui:1,guid:[1,8],gvf:17,h6S:17,had:10,half:1,handl:[0,1,2,5,9,10,14,18],handler:8,happen:9,happi:4,hardwar:7,has:[4,6,7,9,10,14],hash:[1,5],hashsiz:5,hashtabl:5,hat:2,have:[0,1,2,6,7,9,10,13,14,16,18],header:[1,2,5,6,10,13,15],help:[2,4,5,7,8,10,11,18],here:[4,5,6,7,9,10,11,13,14,18],hesit:5,hex:[2,4,5,13],hexdump:2,hfsc:1,hide:0,hierarchi:[0,1,4,10],high:[0,4,7,10,13],highlight:11,hint:6,histor:9,home:[5,7],hood:18,hook:[9,11],hop:[9,10],hoplimit:[7,9,10],host:[2,9],how:[0,2,4,5],howev:10,htb:1,html:11,http:[3,5,7,9,11,16],hundr:[9,10],i386:1,i686:1,idea:0,identifi:[9,10],idpb:12,ids:1,idx:[7,9,10,12,14],if_slav:1,ifa_address:13,ifa_cacheinfo:13,ifa_famili:13,ifa_flag:13,ifa_index:13,ifa_label:10,ifa_loc:13,ifa_pref:13,ifa_prefixlen:13,ifa_scop:13,ifa_unspec:13,ifa_valid:13,ifac:[5,9],ifaddrmsg:[0,10,13,15],ifalia:1,ifconfig:10,ifdb:9,ifi_chang:2,ifi_famili:2,ifi_flag:2,ifi_index:2,ifi_typ:[2,10,13],ifindex:10,ifinfbas:0,ifinfmsg:[0,1,2,10,15],ifinfveth:0,ifla_af_spec:10,ifla_carri:10,ifla_group:10,ifla_ifnam:[10,13],ifla_info_data:[1,10],ifla_info_kind:10,ifla_linkinfo:10,ifla_linkmod:10,ifla_macvlan_macaddr:10,ifla_mtu:10,ifla_net_ns_fd:14,ifla_num_rx_queu:10,ifla_num_tx_queu:10,ifla_operst:10,ifla_promiscu:10,ifla_txqlen:10,ifla_wireless:13,iflag:10,ifnam:[1,2,6,7,9,10,12,14,18],ifr:10,ignor:[2,4,5,11,13,15,18],ignore_rt:9,iif:[9,10],iifnam:10,immedi:[9,11,15],implement:[0,1,4,5,6,7,9,10,14,15],impli:9,implicit:[7,9,10],implicitli:14,improv:1,imq:10,incapsul:13,includ:[1,10,13,15],incom:[0,5,6,10,14],incomplet:2,inconsist:11,incorrect:1,increas:[1,15],indec:10,index:[1,2,7,8,9,10,12,13,14,15],indic:10,indirectli:18,info:[1,9,10,18],inform:[2,5,9,13,16],ingress:[1,10],inherit:[0,1,6,13],init:[0,1],initi:[1,5,6,13],inject:[10,12],inor:1,input:[9,10],insert:9,insid:2,inspect:[2,4,5,6],instal:[1,5,6,8,10],instanc:[6,9,11,14,15],instanti:[10,13],instead:[0,1,2,4,9,10,11,13,14],instruct:2,instrument:3,int32:6,intefac:9,integ:[9,10],integr:[1,10],intend:[2,4,10,14],intens:15,intention:6,interact:9,interest:[0,6],interfac:[0,1,5,6,7,8,10,12,13,16,18],interfer:9,intern:[1,9,10,11],internet:8,interpret:[6,14],intersect:1,intf:9,introduc:10,introduct:12,invalid:5,invok:[9,15],iobrok:1,iocor:1,ioctl:[0,10,14],ioloop:1,ip4addr:[4,13],ip4msg:0,ip6addr:13,ip6gr:10,ip6gre_:10,ipaddr:[1,7,9,13],ipb:[2,10],ipbatch:[0,2,10],ipbatchsocket:0,ipc:1,ipdb:[1,4,7,8,13,14,18],ipdb_main:14,ipdb_test:14,ipq:[0,1,7],ipq_base_msg:0,ipq_mode_msg:[0,13],ipq_packet_msg:0,ipq_verdict_msg:0,ipqsocket:0,ipr:[0,2,4,7,10,12,14,15,18],iprout:[0,1,2,4,5,7,8,13,14,15,18],iproute2:[10,13],iproutemixin:[0,2,10],iprouterequest:10,iprsocket:[0,1,4,15],iprsocketmixin:0,ipset:[0,1,4,7],ipset_01:4,ipset_attr_adt:1,ipset_attr_data:1,ipset_cmd_list:4,ipset_cmd_protocol:4,ipset_msg:[0,4],iptabl:7,ipv4:[1,9,10,13],ipv6:[1,6,9,10,13],ipvlan:1,isinst:[1,18],isol:[1,11],issu:[1,3,4,5,7,8,11,12,14,16],issubclass:[1,18],issuecom:9,item:6,iter:[9,13,15],its:[2,4,6,10,13,14],itself:[0,4,5,7,9,10,13],iw_ev:13,iwutil:[0,1,4],j0d:17,join:9,just:[0,2,4,5,6,9,10,13,14,15],k6p:17,kdm:17,keep:[9,10,11,13,14,15,16,18],kei:[0,1,4,6,9,10,12,15],kernel:[0,1,2,4,9,10,12,13,16],keyword:[9,10],kill_rtcach:9,kind:[2,7,9,10,14,18],knife:10,know:[5,10],kvm:11,kwarg:[5,9,10,14],l2addr:[4,6,13],label:[7,8,10],lambda:[6,10,15],last:15,later:[0,2,6,9,10],latest:3,latter:9,launch:[10,11,15],layer:0,layout:[1,13,18],lazi:5,leak:1,least:9,leav:[9,10],lee:1,legal:1,len:[9,10,13],length:[2,5,10,13],less:[4,6,10],let:[0,1,4,5,10],letter:10,level:[0,4,7,9,10,11,13,14,15],lib:11,libc6:2,libc:14,librari:[0,2,3,4,5,6,7,9,10,14,15],libvirt:11,licens:[1,2],like:[4,5,6,9,10,13,14],limit:[0,10],line:[2,11],link:[1,2,8,9,10,11,14],link_creat:7,link_lookup:[7,10,12,14,18],linkedset:1,linux:[2,7,9,10,12,16],list:[0,1,4,5,7,8,9,10,12,13,15,18],listen:1,listnetn:[7,14],liter:6,littl:7,lladdr:10,lnst:11,load:[1,4,9,10,14,15],local:[1,2,9,10,11],locat:14,lock:[9,18],lockf:14,log:15,logic:0,logo:1,longer:9,look:[5,6,13],lookup:[7,9,10,14],loop:[1,9,14,15],loopback:[7,15],lot:18,low:[4,7,14],lower:10,lowest:5,lqt:17,lucki:13,lwtunnel:[1,7,10],mac:[1,6,10,13],macaddr:9,machin:6,macvlan:[1,10],macvlan_mod:10,macvtap:[1,10],macvtap_mod:10,made:9,magic:0,mai:[1,9,10,13,18],main:[0,1,7,9,14,18],maintain:9,make:[1,2,3,5,7,9,10,11,13,15,16,18],makefil:[3,8],man:13,manag:[0,1,6,7,8,10],mandatori:14,mani:[1,6,7,9,10,12,15],manipul:[4,7],manpag:5,manual:[7,13],map:[1,7,13],mar:2,mark:[1,13],marshal:[2,8,18],mask:[1,2,9,10,13],masquerad:1,massiv:15,master:[1,10],match:[0,1,4,9,10],matter:13,max:[5,10],maxelem:5,maximum:5,mayb:7,mean:[0,5,6,9,10,13,15,18],meaningless:14,measur:16,mechan:10,member:[5,13],memori:1,mention:[2,14],merg:[6,9],messag:[1,2,6,7,8,9,15,18],message_typ:6,method:[0,1,2,4,5,6,9,10,14,18],metric:[1,7,10],min:10,mind:[9,10,11,13,14,15,16,18],minimum:5,minor:1,mip:1,mir:1,mirror:1,mismatch:9,miss:[5,10],mitig:1,mix:13,mixin:[0,10],mode:[1,8,10],model:1,modern:[9,10,14],modifi:[9,10],modprob:7,modul:[1,2,6,7,8,11,12,13,14,18],moment:[9,15],monitor:[1,5,7,9],monkey_patch:18,more:[1,2,3,4,5,6,7,9,10,13,14,15,18],moreov:9,most:9,mostli:[5,6,11,15],move:[1,6,7,8,18],movement:1,mpl:[1,7,8,10,13],mpls_iptunnel:[7,12],mpls_router:[7,12],msg:[0,6,9,10,13,15],msg_class:15,msg_controllen:[2,5],msg_flag:[0,2,5,15],msg_id1:15,msg_id:15,msg_iov:[2,4,5],msg_name:[2,4,5],msg_pid:15,msg_seq:15,msg_type:15,mtu:[7,9,10],much:[9,14,15,18],multi:1,multicast:[7,9],multipath:[1,10,12],multipl:[1,4,9],multiprocess:14,must:[0,3,5,6,7,10,13,15,18],mutabl:13,mvlan0:10,mvq0:17,mvtap0:10,my_program:14,myprog:10,n2u:17,name:[1,5,6,7,9,10,13,14],name_dst:5,name_src:5,namespac:[0,1,8,10],nativ:15,natur:0,ndb:10,ndmsg:[0,5,10],need:[5,6,9,10,13,15,16],neigh:10,neighbour:[1,10],neither:[5,9,18],nest:13,net:[1,5,7,10,12],net_ns_:1,net_ns_fd:[1,7,14],net_ns_pid:1,netem:1,netfilt:7,netlink:[1,4,5,6,7,9,10,14],netlink_listen_all_nsid:1,netlink_netfilt:[4,5],netlink_rout:2,netlink_sock_diag:1,netlinkerror:1,netlinkmixin:[0,15],netlinksocket:[0,1,10,15],netn:[0,1,4,7,8,10,18],netns_nam:14,netnserv:14,network:[0,1,2,4,6,8,9,10,14,15,18],networkmanag:9,neutron:11,never:13,newdst:[7,12],newli:9,next:[0,1,6,18],nexthop:9,nfgen_famili:5,nfgen_msg:0,nfnetlink:[0,1,2,4,5,7],nftabl:[1,7],nic:10,nl80211:[0,1,2,4,5,7],nl80211_attr_gener:5,nl80211_attr_ifindex:5,nl80211_attr_ifnam:5,nl80211_attr_iftyp:5,nl80211_attr_mac:5,nl80211_attr_wdev:5,nl80211_attr_wiphi:5,nl80211cmd:[0,5],nl_async:9,nl_bind_group:9,nla:[0,1,4,5,10,13,14],nla_bas:0,nla_f_nest:13,nla_map:10,nla_nam:13,nla_name1:13,nla_namei:13,nla_namex:13,nla_typ:13,nlflag:0,nlm_f_ack:[5,10,13],nlm_f_creat:[10,13],nlm_f_excl:[10,13],nlm_f_request:[10,13],nlm_request:[0,5,10],nlmsg:[0,1,2,4,10,13],nlmsg_atom:0,nlmsg_base:0,nlsock:13,nlsocket:[0,1,15],nmcli:9,node:10,non:[1,9],nonc:[1,13],none:[5,6,9,10,13,14,15],nope:14,nor:[5,9,18],normal:[1,9,10,14,15,18],nose:3,nosetest:[3,7,11],notat:[1,9,10,12,13],note:[8,9,10,13,15,18],noth:[6,14],notic:[2,4,5,7,9,10,11,12,13,14,15],now:[1,2,5,6,7,10],nslink:[0,14,18],nsname:[14,18],nsp:14,nspath:14,nspopen:[1,8],nsy:17,number:[2,6,12,13,14,15],nvie:3,o_creat:14,o_excl:14,o_exist:14,obj:15,object:[0,1,4,7,9,10,13,14,15,18],obsolet:1,occasion:[5,9],occur:7,offset:[10,14],oflag:10,often:[9,10],oif:[7,9,10,12],oifnam:10,old:[1,9,10],older:2,onc:[2,9,15],one:[0,1,2,4,5,6,9,10,11,12,13,14,15,18],ones:[10,15],onli:[0,1,2,4,5,6,7,8,10,11,12,13,14,15,18],oop:1,open:[7,14],open_bpf_fd:10,oper:[1,5,9,10,14,18],operst:10,optim:1,option:[1,5,9,10,11,13,15],order:[0,13,14],ordinari:[0,6],org:[3,5,7],other:[0,1,4,5,6,7,8,10,13,14,15,18],otherwis:[4,10],out:[5,6,9],outgo:[6,10],output:[1,2,4,9,10,11],outsid:[9,10],over:[0,1,10,15],overflow:[10,15],overview:8,ovs:[0,1],own:[1,2,4,9,10,13,14],p2p:10,p6p1:10,pack:[6,13],packag:[1,2,11,18],packet:[0,1,2,4,5,7,9,10,12,14,15],pad:[6,13],page:[3,4,8,12,13],pair:[0,7,9,10,14],paramet:[1,3,6,9,10,11,14,15,16],parameter_list:6,parent:[10,13],pars:[0,1,2,4,10,14,15,18],parser:[1,2,6,10,15],part:[4,5,10],parti:7,partial:1,particular:[1,5,10,15],particularli:5,partli:4,pass:[0,1,2,9,10,13],passthru:10,patch:[5,9],path:[1,9,11,18],pattern:11,payload:13,pdb:11,peer:[1,7,10,14],pep8:3,perform:[3,6,7,8,10,11,15],perman:10,permiss:5,permit:13,perspect:10,perturb:10,pf_local:2,pf_netlink:[2,4],phy0:5,phy:5,pickl:[1,14],pid:[2,4,5,10,13,14,15],pip:[2,7,10],pipe:[1,10,14],place:[4,9,18],plai:[0,15],plan:[9,10,15],platform:[1,14,16],platform_label:[7,12],pleas:[4,5,9,10,13,14,15,16],pls:[5,9],plug:1,plugin:[1,9,10],point:[9,10],polic:[1,10],polici:[1,4,6,9,10,15],poll:[0,6,9,14,15,18],popen:14,port0:9,port:[1,4,6,7,8,10,15],possibl:[0,2,4,5,6,7,9,10,11,12,13,14,15,16,18],post:9,ppc64:1,pprint:[7,16],pre:[9,13],predic:[10,15],prefer:[5,10],preferr:0,prefix:[9,10],prefixlen:[7,9,10,13],prefsrc:10,prepar:[0,1,5],present:10,pretti:0,prevent:9,previou:10,primari:[1,10,13],primarili:4,print:[7,9,10,12,14,15],prio:10,priomap:1,prior:[9,10,15],priorit:15,prioriti:[1,10,15],privat:10,probabl:[2,10],proc:[1,14],procedur:6,process:[1,2,7,8,9,10,11,13,15],produc:2,product:[5,15],profil:10,program:[5,9,10,15],programm:10,progress:[1,7],project:[1,2,4,5,7,8,9,11,12,16],promote_secondari:13,proper:[0,13],properli:[5,9,10],properti:9,protinfo_bridg:10,proto:[2,10],protocol:[1,2,5,7,8,10,13,14],provid:[0,1,2,4,5,6,7,9,10,13,14,15,16,18],proxi:[0,1,4,10,14,18],proxyarp:9,psched:1,ptrace:1,pull:[1,3,5],pure:7,purg:10,purpos:14,push:[1,7,12],put:[0,5,6,10,15],pvid:10,pwd:[2,4,5],pyinstal:1,pypi:[1,3,5,7],pyrout:2,pyroute2:[0,2,3,4,5,6,9,10,11,12,14,15,16,18],pyroute2_tests_ro:1,python2:[1,2],python3:[1,2,11],python:[1,2,3,4,5,7,9,10,11,13,14,15,16,18],pythonpath:[2,4,5],qdisc:[1,10],qemu:11,qpl:17,qpython:1,qsize:15,quantum:10,queri:0,queu:15,queue:[0,1,7,8,15],quick:14,quickstart:8,quit:12,quota:7,race:[1,9],rais:[0,5,9,10],rang:13,range_begin:10,range_end:10,rate:10,rational:4,raw:[2,5,6,10,15],rawiprout:[0,10],rawiprsocket:0,rawiprsocketmixin:0,rcvch:14,react:9,read:[1,5,7,8,10,14,15],reader:[9,15],readi:9,readm:3,readthedoc:3,real:[10,18],realli:[9,13,18],realm:10,reason:[5,9,10,11,13,14,18],reassembl:1,receiv:[5,10,15,18],recogn:9,record:[1,9,10],recreat:9,recurs:[4,10,13,18],recv:[0,2,5,14,15,18],recvmsg:[2,4,5],red:2,redirect:10,reexport:18,refactor:1,refer:[1,4,5,9,10,12,13,14,15,18],reflect:[9,10,12,18],regard:11,regist:[0,15],register_callback:[9,15],register_polici:[4,15],regular:9,regularli:10,reject:10,rel:1,relat:[1,5,11,14],releas:[1,7,8,9,14],relev:10,reli:9,remot:[0,1],remotesocket:0,remov:[1,7,8,9,10,13,15,18],renam:[5,9,10],rep:1,replac:[1,10,14,15],repo:[2,11],report:[8,10,11],repres:[1,9,10,13],req:[1,10,12],request:[0,1,2,3,4,5,9,10,12,13,14,15],requested_ip:6,requir:[0,1,2,4,8,9,10,11,12,13,14,15,16],reserv:[5,10,13,15],reset:[0,2,10],resid:[6,12],resolv:13,resourc:[1,8,9,14,15],respect:1,respons:[0,1,2,5,8,13,14,15],rest:[2,6],restart:[1,10],restart_on_error:9,restor:9,restrict:9,result:[0,10,15],retriev:[9,10],reus:1,revert:9,review:[1,9,14],revis:[1,5],rework:1,rhel6:1,rhel7:1,rhel:1,rhev:7,right:6,riprsocket:0,risk:9,roll:[7,9],root:[1,10,11,15,18],rout:[0,1,2,7,8,10,14],routekei:9,routin:[1,6,9,10,15],rpc:1,rpm:[1,2],rsc:10,rt_proto:10,rt_scope:[10,13],rt_scope_host:10,rt_scope_link:10,rt_scope_nowher:10,rt_scope_sit:10,rt_scope_univers:10,rt_type:10,rta_flow:1,rta_via:1,rtab:1,rtax_hoplimit:[9,10],rtax_mtu:10,rtm_deladdr:15,rtm_dellink:15,rtm_delqdisc:10,rtm_getlink:[0,15],rtm_newaddr:[13,15],rtm_newlink:[9,10,13,15],rtm_newqdisc:10,rtmsg:[0,1,2,9,10],rtmsg_base:0,rtnetlink:[8,10],rtnl:[0,1,2,4,5,7,10,13,14,18],rtscope:10,rtt:9,rule:[1,2,6,8,10,15],rulekei:9,run:[0,2,3,4,5,9,10,11,14,15,16,18],runtim:[4,8,13],runtimeerror:9,rwva:17,sa_famili:[2,4,5],safe:[10,11,15],sai:[4,5,18],same:[0,1,2,4,9,10,13,14,15,18],sampl:[4,5,8,9,12,14],save:[10,15],scan:[13,18],scheme:[9,10,15,18],school:10,scope:[1,2,9,10,13],script:[2,4,5,9,11],search:8,second:[10,15,18],secondari:10,section:6,see:[0,1,3,4,5,7,9,10,13],seen:6,select:[6,14,15,18],self:[0,4,10,15],selinux:[3,14],semant:[14,18],send:[0,2,5,10,14,15],sendmsg:[5,18],sendto:[0,2,4,5,10,13,14,15],sens:0,sent:[2,6,10],separ:[1,5,9,13,14],seq:[13,15],sequenc:[1,2,9,13,14,15],sequence_numb:[0,2,5,10,13,15],serv:0,server:[1,6,14],server_id:6,servic:[1,5,10],session:[5,9],set:[0,1,2,4,7,8,9,10,11,12,13,15],set_a:5,set_address:9,set_b:5,set_mtu:9,set_nam:9,setn:[1,14],setsockopt:[2,15],setup:[1,5,9,10,18],setuptool:11,sever:[2,4,5,7,9,10,11,13,15],sfq:[1,10],shadow:1,share:[1,10],shortcut:[0,10,18],should:[0,2,3,4,5,6,9,10,12,13,14,15,18],shouldn:9,show:10,shown:[2,10],shut:[9,14],shutdown:[1,9,18],side:14,sig_ign:18,signal:8,signatur:[1,10,18],signific:[4,9,18],significantli:10,signum:18,sigterm:18,similar:6,simpl:[0,1,4,5,9,10,13,14],simpler:[9,13],simplest:[4,8,9,15],simplex:14,simpli:18,simplic:18,simplifi:13,sinc:[2,5,7,9,10,11,13,18],singl:[1,12],siocgiwnam:13,siocgiwnwid:13,siocgiwscan:13,siocsiwcommit:13,siocsiwnwid:13,situat:9,size:[5,10],sjr:17,skip:[2,11,12,13],slowli:6,so_rcvbuf:[2,15],so_sndbuf:[1,2],sock:6,sock_cloexec:2,sock_dgram:2,sock_diag:1,sock_raw:[2,4],socket:[1,2,4,5,7,8,10,12,13,14,18],sockopt:15,softwar:8,sol_socket:2,solut:[10,14,15],some:[0,1,2,3,4,5,6,7,9,10,12,13,14,15,18],some_attr:15,somenetn:14,someon:[7,9,10],someth:[4,5,15],sometim:[0,9,15,16],somewher:[4,18],soon:9,sor:17,sort:1,sort_address:9,sourc:[1,5,10],space:[2,4,13,15],spare:15,spawn:[8,10],speak:14,spec:[1,9,10],special:[8,9,10],specif:[1,5,6,9,10,11,13,14,16,18],specifi:[2,6,9,10,13,14,15],speed:1,sphinx:[1,11],src:[2,9,10],src_len:10,ssl:1,stabl:18,stack:[9,10,12],stage:5,stai:[9,18],standalon:5,standard:[10,14],start:[0,1,2,4,7,9,10,14,15],startswith:9,startup:[9,14],state:[1,2,5,6,7,9,10,14,15],statement:[6,7,9,10,18],statist:7,statu:14,stderr:[1,14],stdin:[1,14],stdlib:7,stdout:[1,14],step:13,still:[1,2,5,14,15],stop:[1,9,14],store:[5,10,15],storm:[9,15],stp:9,str:[2,10],strace:[4,5,8],stream:13,stress:15,strict:1,strictli:[3,14],string:[2,4,5,6,9,10,12,13,14,15],strip:6,struct:[6,10,13],structur:[1,4,5,6,10,13],stuff:[0,1,2,14],stype:5,sub:1,submit:12,subnet:10,subpackag:1,subprocess:14,subscrib:18,substitut:14,subsystem:[10,13],sudo:[4,7,9,10,11,12,16],supplementari:0,support:[0,1,4,5,7,9,10,11,12,14,15,18],suppos:[9,14],suppress:[9,15],sure:[2,6,9],surpris:4,svinota:[3,5,7,9,11,16],swap:[5,12],swiss:10,switchdev:10,symbol:[2,18],sync:[1,7,9],synchron:[9,14],syntax:[1,6,10,11],syscal:1,sysctl:[7,12,13],system:[0,5,6,7,9,10,11,14,16],systemd:5,tabl:[1,9,10,12],tag:10,take:[1,5,9,10,13,14],tap0:[9,10],tap:[1,10],tarbal:1,target:[1,7,8,10,13,14],task:[14,18],taskstat:[0,4,7],taskstatsmsg:0,tbf:1,tca_act_bpf:1,tca_u32_act:1,tcmd:0,tcmsg:[0,1],tcp:1,tcy:17,teamd:0,term:[9,10],termin:[13,15],test:[1,2,5,7,8,10,12,14,15,16,18],test_cas:11,test_fil:11,test_if:18,test_ipdb:[11,12],test_ipr:[11,12],test_netn:14,test_platform:16,test_stress:11,testcapsrtnl:16,testclass:11,testexplicit:11,than:[5,9,15],thank:1,thei:[0,2,4,6,9,10,12,13,15,18],them:[0,2,4,5,9,10,11,13,14,16,18],thereaft:[2,9],thermal:7,thermal_ev:[1,7],thi:[0,1,4,5,6,9,10,13,14,15,16,18],thing:9,think:[4,8],those:10,though:[5,9,10,13,14],thousand:[9,10],thread:[1,8,9,15],threadless:[1,8],three:[5,9,10,13],through:[0,10],thu:[4,7,9,10,14],time:[0,1,2,9,10,15],timeout:[1,5],timeoutexcept:1,tnum:9,tobyt:6,todo:10,togeth:10,tolist:6,too:[0,5,9,14],tool:[5,14],top:14,tos:[1,10],total:6,touch:9,trace:[2,4,5],track:5,tracker:16,tradit:10,traffic:[5,7,9,10],transact:[0,1,6,7,8],transfer:14,transform:6,transit:1,translat:10,transpar:[0,4,7,10,14],transport:[0,1,4,7,15],treat:[13,14],tree:13,tri:[9,10],tstamp:13,tstat:13,ttl:10,tu4:17,tun:[1,10],tunnel:10,tuntap:[0,1,10],tuntap_data:10,tupl:[5,9,13,14,15],turn:[9,14,15],tutori:9,two:[0,1,2,5,6,9,10,13,14,15,18],txqlen:[9,10],txt:10,type:[0,1,2,4,5,6,7,9,10,12,15,16],typic:14,typl:13,u32:1,udp4_pseudo_head:0,udp:[1,6],udpmsg:0,uid:10,uint16:[10,13],uint32:[4,13,14],uint64:[6,13],uint8:[6,13],uint:13,unchang:10,undefin:9,under:[1,2,14,18],underli:10,understand:9,unfreez:9,unicast:[9,10],unicast_flood:10,unicod:1,unif:10,uniform:9,uniqu:[10,13],unit:1,univer:13,unix:[1,5],unknown:10,unless:[9,10],unlik:[5,9,10],unmodifi:14,unnecessari:9,unpack:13,unreach:[9,10],unregist:15,unregister_callback:15,unregister_polici:15,unsign:13,untag:10,until:[2,7,9,13],updat:[1,9,10],uplink:1,upon:[9,10,15],upper:10,upstream:10,url:2,usabl:5,usag:[1,3,10,12],usc:10,use:[0,1,2,3,4,5,7,9,10,11,13,14,15,18],usecas:8,used:[1,2,4,5,6,10,11,13,14,15,16,18],useful:[0,4,9,10,13],user:[0,1,4,5,6,9],userspac:[0,7,15],uses:[0,1,4,9,10,14],using:[0,1,4,6,9,10,11,15],usual:[4,5,13],usus:10,utf:13,util:[0,1,5,7,9,11],uuid4:1,uuid:9,v0p0:[7,14],v0p1:[7,14],v100:10,v100c:10,v1m:17,v1p0:10,v1p1:10,v500:10,valid:0,valu:[4,5,6,10,13,15],valuabl:5,variabl:10,variant:[2,9],vector:10,vepa:10,verdict:0,veri:[5,6,13],version:[1,2,5,13,16,18],veth0:[9,10],veth1:9,veth2:9,veth:[1,7,10,14],vfs_dquot:[1,7],via:[0,1,2,5,9,10,12,14,18],vid:10,view:[1,8],vim:3,virbr0:[2,9,10],virtual:[9,10],visibl:[10,11],vlan:[1,10],vlan_filt:[1,10],vlan_flag:1,vlan_id:10,vlan_info:10,vlan_protocol:10,vni:10,vpn:9,vrf:[1,9,10],vrf_tabl:[1,10],vru:17,vx101:10,vx500:10,vxlan:[1,10],vxlan_data:10,vxlan_group:10,vxlan_id:10,vxlan_link:10,vxlan_ttl:10,wai:[0,4,5,6,9,10,13,14,15,18],wait:[1,7,9,14,18],wait_interfac:1,wait_ip:[1,7],want:[2,4,5,9,13,15],warn:[5,15],wast:10,watchdog:1,weight:9,weird:9,welcom:5,well:[4,9,13,14],were:[1,10,13],what:[2,5,9,10],when:[0,1,2,5,6,8,9,10,13,14,18],whenev:0,where:[0,9,10,11,12,13,14],whether:9,which:[5,9,10,14],whole:2,why:[2,9,14],wide:11,width:6,wifi:18,window:9,wireless:[4,5,7,13],within:[0,6,8,9,10],without:[5,10,11],wlan0:10,wlevel:11,wlo1:18,wlp3s0:13,word:10,work:[0,1,2,3,4,5,6,7,9,13,14,18],workaround:[1,2,14,15,18],workflow:[9,14],worst:14,would:[10,14,18],wrap:0,wrapper:18,write:[6,9],written:18,wrong:14,wrote:4,x00:[2,4,5],x01:[2,4],x02:[2,4],x03:[2,4],x05:[2,4,5],x06:[2,4],x07:4,x10:2,x14:2,x18:2,x1a:2,x1b:5,x1c:4,x28:2,x30:5,x3c:2,x49:2,x55:2,x58:5,x61:2,x78:4,x84:2,x95:4,xav:17,xe3:4,xe4:4,xid:6,xml:11,xunit:1,ybl:17,yes:13,yet:[5,6,9,10,14],ygx:17,you:[2,3,4,5,6,7,9,10,11,13,15,16,18],your:[2,5,9,10,13,16],yourself:5,zero:13},titles:["Module architecture","changelog","Netlink debug howto","Project contribution guide","Modules layout","Modules in progress","DHCP support","pyroute2","pyroute2 netlink library","IPDB module","IPRoute module","makefile documentation","MPLS howto","Netlink","Netns management overview","Base netlink socket and marshal","report a bug","<no title>","Quickstart"],titleterms:{"case":18,"class":[4,9,15],"default":9,"import":[4,18],The:9,about:10,address:9,algo:13,api:[9,10],architectur:[0,10],arrai:13,async:15,asynchron:15,attribut:13,base:15,basic:13,bridg:9,bug:16,cach:0,chang:5,changelog:1,choke:10,clean:11,clsact:10,commun:5,compat:2,compil:2,context:9,contribut:3,creat:[9,13,14],daemon:5,data:2,debug:[2,4],decod:[2,13],defer:4,develop:[8,11],dhcp:6,differ:9,disciplin:10,disclaim:5,dist:11,doc:11,document:11,doesn:15,drr:10,dump:2,encod:13,enobuf:15,epydoc:11,eventlet:18,except:18,field:[6,13],filter:10,from:9,gener:8,get:9,guid:3,handler:18,help:15,hfsc:10,hood:0,how:10,howto:[2,8,12],htb:10,indic:8,inform:8,instal:[7,11],interfac:[9,14],internet:0,ipdb:[0,9,10,12],iprout:[9,10,12],iproute2:9,ipset:5,ipv4:6,issu:9,kernel:5,label:12,layout:4,librari:8,link:[3,7],list:14,lwtunnel:12,makefil:11,manag:[9,14],mangl:0,marshal:[4,15],messag:[0,4,5,10,13],metric:9,mode:9,modul:[0,4,5,9,10],move:14,mpl:12,multipath:9,namespac:[7,14],netlink:[0,2,8,13,15],netlinksocket:4,netn:14,network:[5,7],nla_map:13,nlmsg_error:10,note:2,nspopen:14,onli:9,option:6,other:[9,11],overview:14,packet:[6,13],pars:13,perform:9,persist:9,port:9,prioriti:9,process:14,progress:5,project:3,protocol:[0,4,6],pyrout:5,pyroute2:[7,8,13],queue:10,quickstart:[9,10,18],read:9,releas:18,remov:14,report:16,requir:[3,7],resourc:18,respons:10,revers:5,rout:[9,12],rtnetlink:7,rule:9,runtim:18,sampl:7,send:13,set:[5,14],signal:18,simplest:7,socket:[0,6,15],softwar:9,spawn:14,special:18,strace:2,submit:5,support:6,syntax:9,tabl:8,target:11,test:[3,11],think:10,thread:[0,10],threadless:10,transact:9,type:13,u32:10,under:0,usag:8,usecas:7,util:4,view:9,when:15,within:14,work:10}}) \ No newline at end of file +Search.setIndex({docnames:["arch","changelog","debug","devcontribute","devgeneral","devmodules","dhcp","general","generator","index","ipdb","iproute","ipset","makefile","mpls","netlink","netns","nlsocket","report","usage","wiset"],envversion:52,filenames:["arch.rst","changelog.rst","debug.rst","devcontribute.rst","devgeneral.rst","devmodules.rst","dhcp.rst","general.rst","generator.rst","index.rst","ipdb.rst","iproute.rst","ipset.rst","makefile.rst","mpls.rst","netlink.rst","netns.rst","nlsocket.rst","report.rst","usage.rst","wiset.rst"],objects:{"pyroute2.dhcp":{array:[6,1,1,""],dhcp4socket:[6,0,0,"-"],dhcpmsg:[6,1,1,""],option:[6,1,1,""]},"pyroute2.dhcp.array":{tobytes:[6,2,1,""]},"pyroute2.dhcp.dhcp4socket":{DHCP4Socket:[6,1,1,""]},"pyroute2.dhcp.dhcp4socket.DHCP4Socket":{get:[6,2,1,""],put:[6,2,1,""]},"pyroute2.dhcp.dhcpmsg":{array8:[6,1,1,""],be16:[6,1,1,""],be32:[6,1,1,""],client_id:[6,1,1,""],none:[6,1,1,""],string:[6,1,1,""],uint8:[6,1,1,""]},"pyroute2.ipdb":{main:[10,0,0,"-"]},"pyroute2.ipdb.main":{IPDB:[10,1,1,""]},"pyroute2.ipdb.main.IPDB":{eventloop:[10,2,1,""],eventqueue:[10,2,1,""],register_callback:[10,2,1,""],release:[10,2,1,""]},"pyroute2.iproute":{bsd:[11,0,0,"-"],linux:[11,0,0,"-"]},"pyroute2.iproute.linux":{IPBatch:[11,1,1,""],IPRoute:[11,1,1,""],RTNL_API:[11,1,1,""],RawIPRoute:[11,1,1,""]},"pyroute2.iproute.linux.RTNL_API":{addr:[11,2,1,""],brport:[11,2,1,""],fdb:[11,2,1,""],flush_addr:[11,2,1,""],flush_routes:[11,2,1,""],flush_rules:[11,2,1,""],get_addr:[11,2,1,""],get_classes:[11,2,1,""],get_default_routes:[11,2,1,""],get_filters:[11,2,1,""],get_links:[11,2,1,""],get_neighbours:[11,2,1,""],get_ntables:[11,2,1,""],get_qdiscs:[11,2,1,""],get_routes:[11,2,1,""],get_rules:[11,2,1,""],get_vlans:[11,2,1,""],link:[11,2,1,""],link_lookup:[11,2,1,""],neigh:[11,2,1,""],route:[11,2,1,""],rule:[11,2,1,""],tc:[11,2,1,""],vlan_filter:[11,2,1,""]},"pyroute2.ipset":{IPSet:[12,1,1,""],PortEntry:[12,1,1,""],PortRange:[12,1,1,""]},"pyroute2.ipset.IPSet":{"delete":[12,2,1,""],add:[12,2,1,""],create:[12,2,1,""],destroy:[12,2,1,""],flush:[12,2,1,""],get_supported_revisions:[12,2,1,""],headers:[12,2,1,""],list:[12,2,1,""],rename:[12,2,1,""],swap:[12,2,1,""],test:[12,2,1,""]},"pyroute2.iwutil":{IW:[5,1,1,""]},"pyroute2.iwutil.IW":{add_interface:[5,2,1,""],associate:[5,2,1,""],authenticate:[5,2,1,""],connect:[5,2,1,""],deauthenticate:[5,2,1,""],del_interface:[5,2,1,""],disassociate:[5,2,1,""],disconnect:[5,2,1,""],get_associated_bss:[5,2,1,""],get_interface_by_ifindex:[5,2,1,""],get_interface_by_phy:[5,2,1,""],get_interfaces_dict:[5,2,1,""],get_interfaces_dump:[5,2,1,""],get_stations:[5,2,1,""],join_ibss:[5,2,1,""],leave_ibss:[5,2,1,""],list_dev:[5,2,1,""],list_wiphy:[5,2,1,""],scan:[5,2,1,""]},"pyroute2.netlink":{nlsocket:[17,0,0,"-"]},"pyroute2.netlink.nlsocket":{BatchBacklog:[17,1,1,""],BatchBacklogQueue:[17,1,1,""],BatchSocket:[17,1,1,""],Marshal:[17,1,1,""],NetlinkMixin:[17,1,1,""],NetlinkSocket:[17,1,1,""]},"pyroute2.netlink.nlsocket.BatchBacklogQueue":{append:[17,2,1,""],pop:[17,2,1,""]},"pyroute2.netlink.nlsocket.BatchSocket":{get:[17,2,1,""]},"pyroute2.netlink.nlsocket.Marshal":{parse:[17,2,1,""]},"pyroute2.netlink.nlsocket.NetlinkMixin":{get:[17,2,1,""],get_policy_map:[17,2,1,""],put:[17,2,1,""],register_callback:[17,2,1,""],register_policy:[17,2,1,""],unregister_callback:[17,2,1,""],unregister_policy:[17,2,1,""]},"pyroute2.netlink.nlsocket.NetlinkSocket":{bind:[17,2,1,""],close:[17,2,1,""]},"pyroute2.netlink.rtnl.tcmsg":{cls_u32:[11,0,0,"-"],sched_choke:[11,0,0,"-"],sched_clsact:[11,0,0,"-"],sched_drr:[11,0,0,"-"],sched_hfsc:[11,0,0,"-"],sched_htb:[11,0,0,"-"]},"pyroute2.netlink.rtnl.tcmsg.sched_choke":{options:[11,1,1,""],stats2:[11,1,1,""],stats:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_choke.options":{qopt:[11,1,1,""],stab:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_choke.options.stab":{encode:[11,2,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_choke.stats2":{stats_app:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_drr":{options:[11,1,1,""],stats2:[11,1,1,""],stats:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_drr.stats2":{stats_app:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_hfsc":{options_hfsc:[11,1,1,""],options_hfsc_class:[11,1,1,""],stats2:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_hfsc.options_hfsc_class":{hfsc_curve:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_hfsc.stats2":{stats_app:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_htb":{options:[11,1,1,""],stats:[11,1,1,""]},"pyroute2.netlink.rtnl.tcmsg.sched_htb.options":{htb_glob:[11,1,1,""],htb_parms:[11,1,1,""]},"pyroute2.netns":{create:[16,3,1,""],listnetns:[16,3,1,""],nslink:[16,0,0,"-"],remove:[16,3,1,""],setns:[16,3,1,""]},"pyroute2.netns.nslink":{NetNS:[16,1,1,""]},"pyroute2.netns.nslink.NetNS":{remove:[16,2,1,""]},"pyroute2.netns.process":{proxy:[16,0,0,"-"]},"pyroute2.netns.process.proxy":{NSPopen:[16,1,1,""]},"pyroute2.netns.process.proxy.NSPopen":{release:[16,2,1,""]},"pyroute2.wiset":{IPStats:[20,1,1,""],WiSet:[20,1,1,""],get_ipset_socket:[20,3,1,""],need_ipset_socket:[20,3,1,""]},"pyroute2.wiset.IPStats":{bytes:[20,4,1,""],comment:[20,4,1,""],packets:[20,4,1,""],timeout:[20,4,1,""]},"pyroute2.wiset.WiSet":{"delete":[20,2,1,""],add:[20,2,1,""],close_netlink:[20,2,1,""],content:[20,4,1,""],create:[20,2,1,""],destroy:[20,2,1,""],flush:[20,2,1,""],from_netlink:[20,5,1,""],insert_list:[20,2,1,""],open_netlink:[20,2,1,""],replace_entries:[20,2,1,""],test:[20,2,1,""],test_list:[20,2,1,""],update_content:[20,2,1,""],update_dict_content:[20,2,1,""]},pyroute2:{dhcp:[6,0,0,"-"],iproute:[11,0,0,"-"],ipset:[12,0,0,"-"],iwutil:[5,0,0,"-"],netlink:[15,0,0,"-"],netns:[16,0,0,"-"],wiset:[20,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"],"5":["py","classmethod","Python class method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute","5":"py:classmethod"},terms:{"0ce40d31d937":10,"0x0":11,"0x0000":11,"0x0006":11,"0x00ff":11,"0x1":11,"0x10":11,"0x10000":11,"0x100000":11,"0x10001":11,"0x10010":11,"0x10020":11,"0x2":11,"0x20":11,"0x200":7,"0x200000":11,"0x300":7,"0x4":11,"0x5":11,"0x8":11,"0x8100":11,"0x88a8":11,"0x8b00":15,"0x8b01":15,"0x8b02":15,"0x8b03":15,"0xa":11,"0xc0a80000":11,"0xc0a80001":11,"0xc0a800010":11,"0xf":[7,11],"0xff":11,"0xff0000":11,"0xffc0":11,"0xffff0000":11,"0xffff0001":11,"0xffffff00":11,"0xffffffff":11,"10kbit":11,"10mbit":11,"128kbit":11,"12x":15,"16byte":1,"16s":15,"192kbit":11,"1ad":11,"20_noht":5,"256kbit":11,"2nd":11,"32bit":1,"3rd":[7,11],"4c8":10,"5mbit":11,"7a637a44":10,"80p80":5,"boolean":[5,15],"break":[1,3,8],"byte":[6,8,11,15,17,20],"case":[0,1,2,4,5,6,7,9,10,11,13,14,15,16,17,18,20],"catch":10,"class":[0,1,2,5,6,7,9,12,15,16,19,20],"default":[1,2,5,6,8,11,12,16,17,20],"export":[1,2,4,5,19],"float":11,"function":[1,4,5,6,7,10,11,12,13,16,17,20],"import":[0,1,2,5,7,8,9,10,11,12,14,15,16,18],"int":[2,4,10,11,14,15,17],"long":[8,10,11,20],"new":[1,10,11,13,14,15,16,20],"null":2,"public":[0,1,19],"return":[0,1,4,5,6,8,10,11,12,17,20],"short":[1,10,14],"static":11,"switch":8,"throw":1,"true":[0,1,5,8,10,11,12,13,15,17],"try":[6,10,14,16,18],"while":[0,10,11,14],And:[11,15],But:[0,4,5,6,8,10,11,15,19,20],For:[0,2,5,11,12,13,16,20],IPs:1,OVS:1,One:[4,5,6,10,11,14,15,16,17,19,20],Pls:[2,5,7,14],TLS:1,That:8,The:[0,2,3,4,5,6,9,11,13,14,15,16,17,19],Then:[5,17],There:[0,2,5,6,7,10,11,12,13,15,17,18,19],These:[0,10,11,16],Use:[2,11],Uses:11,Using:[10,15],VMs:1,Will:[5,11],With:[5,7,11,17],__align:15,__enter__:20,__exit__:[10,20],__init__:[4,5,15,19],__pad:15,__u32:15,__u8:15,_rproxi:0,_sproxi:0,abil:11,about:[3,5,7,10,11,15],abov:[2,6,10,11,15,16],absolut:1,ac_exitcod:15,ac_flag:15,accept:[0,6,10,11,14],access:[1,7,10,11,16],accord:[6,11],acess:10,achtung:1,acpi:7,acpi_ev:[1,7],act:[10,11],action:[1,10,11,17],activ:[10,17],actual:[4,10,11],add:[1,2,5,7,10,11,12,14,15,16,20],add_interfac:5,add_ip:[7,10,16],add_nh:10,add_port:[7,10],added:[1,6,10],adding:20,addit:[7,10,11,16],addr:[1,2,7,8,10,11,14,15,17],address:[1,2,4,5,6,7,9,11,15,16,19,20],addrpool:1,adhoc:5,administr:6,adt:1,advmss:10,af_bridg:11,af_inet6:[10,11],af_inet:[7,10,11,14,15],af_mpl:[1,7,14],af_netlink:[2,4,5],af_spec:11,af_unspec:11,affect:[0,11,13,15,19],after:[10,16,17,20],again:[8,10,20],against:13,ageing:10,agnost:[0,11],aim:7,algo:4,algorithm:11,alia:20,alias:6,alignemt:15,all:[1,2,4,5,6,7,8,10,11,12,15,16,17,18,19,20],all_n:17,all_sets_dict:20,alloc:[1,17],allow:[0,1,4,5,7,10,11,20],almost:[5,10,11,12,17],alpha:1,alreadi:[0,6,11,16],also:[1,2,4,5,6,7,10,11,14,15,16,17,18,19,20],alwai:[2,11,15,17,19],analysi:6,android:[1,10],angu:1,ani:[0,1,2,4,5,6,10,11,12,14,16,17,19,20],anoth:[0,2,10,11,14,16,20],anymor:[2,10],anyth:10,anywai:2,ap_vlan:5,apach:1,api:[0,1,4,5,7,9,12,16,17,19],appear:10,append:[11,17],appli:[8,10,11],approach:[10,11],arch:[1,7],architectur:[1,9,16],arg:17,argument:[2,10,11,16,17],argv:[5,8,11,12,16,17],armv6l:1,armv7l:1,around:17,arp:[10,11],arrai:6,array8:6,arriv:[0,10,17],asap:0,ascii:15,asciiz:15,ask:[5,10,11,12],assign:16,associ:5,assum:[0,10,11,17],async:[1,4,9,10,11],async_cach:[0,11,17],asynchron:[0,9,10,15],asyncio:1,asyncron:10,atom:20,attach:[2,11,15],attent:17,attr:[5,10,11,15],attr_revis:[5,12],attr_typ:20,attribut:[1,6,10,11,17,20],auth:1,auth_typ:5,authent:5,authomat:10,autocomplet:2,autodoc:1,autogener:15,autom:13,automat:[7,10,11,17],avail:[5,10,11,12,16,17,19],averag:8,avoid:[10,17],avpkt:11,awar:16,b5e7:10,back:[1,7,10,11],background:[10,16,17,20],backlog:17,bad:16,bala:[10,11],bandwith:11,bar:[5,12],base:[1,4,9,10,11,20],baserout:0,bash:[2,11],basi:10,basic:[1,4,5,6,7,9,10,11,16],batch:[2,11],batchbacklog:17,batchbacklogqueu:17,batchsocket:[0,2,17],be16:[6,15],be32:[4,6,15],be64:15,be8:15,becaus:10,becom:[0,10,17],been:[10,11,20],befor:[7,10,11,16,17],begin:[5,10,12],behav:[0,19],behavior:[11,20],behaviour:[0,10,11,16],behind:0,being:[2,8,16],believ:11,below:[10,11,16],benchmark:1,besid:[0,7,15],best:16,better:10,between:[1,5,10,16,17,19],bewar:17,big:[6,15],bin:8,binari:[0,2,5,11,15],bind:[0,2,4,6,7,11,17,19],bit:[4,6,8,10,11,15],bitmap:[5,12],bitmap_ports_rang:[5,12],blackhol:11,block:[1,7,10],bodi:11,bond:[1,10,11],bool:[11,20],boot:11,bootp:6,bootrequest:6,bos:11,both:[1,5,10,11,15],bound:1,bpf:[1,6,11],br0:11,br0v500:11,br_:10,br_ageing_tim:10,br_forward_delai:10,brace:5,branch:11,brentri:11,bridg:[1,7,9,11],bring:[7,10,11],broadcast:[1,2,7,10,11,17,19],broken:1,brport:[1,11],brport_cost:10,brport_proxyarp:10,brport_unicast_flood:10,brx:11,bsd:[0,1,7,9],bsdmsg:0,bss:[1,5],bssid:5,buf:[0,6],buffer:[1,2,11,15,17],bufsiz:17,bug:[1,4,5,7,9,11],bugzilla:1,build:13,built:[4,13,20],bump:1,bundl:1,burst:[0,10,11,17],bytecod:13,cach:[10,11],cacheinfo:15,calcul:17,call:[0,1,2,5,7,10,11,12,16,17,19,20],callabl:[1,17],callback:[0,1,10,17],caller:20,calm:17,can:[0,2,3,4,5,6,7,10,11,12,13,14,15,16,17,19,20],candi:10,capabl:[1,5,12],carefulli:20,carri:15,cascad:[1,15],cat:19,caus:[0,2,10,11],cdata:15,center2:5,center:5,cento:1,central:5,cgi:1,chaddr:6,chain:[1,11,15],chang:[1,4,7,8,10,11,13,15,16,19],changelog:9,channel:[5,16],channel_fix:5,chantra:1,charact:11,cheaper:10,check:[4,10,16],child:16,choic:10,choke:1,choos:[0,1,11,15],civm:1,classid:11,classifi:11,classless:11,classmethod:20,clean:9,cleanup:1,clear:16,cli:5,client:[0,1],client_id:6,clock:8,clone:[2,20],close:[0,1,4,7,16,17,19,20],close_netlink:20,clsact:1,cmd:5,code:[0,1,3,4,6,10,11,13,14,15,16,18,19,20],codel:1,collect:[0,2,4,5,8,10,13,17,18,19],com:[1,3,5,7,10,18],combin:2,come:[0,5],comma:[5,12],command:[1,2,5,8,10,11,12,13,15,16,18],comment:[2,5,12,20],commit:[0,1,7,10,11,14,16],common:[0,1,2,5,12,13,14],commun:[1,16],compar:10,comparison:1,compat:[0,1,5,6,9,11,12,13,16,17],compil:[1,9,11,13],complement:1,complet:[0,1,5,6,10,11,15],complex:17,compli:3,complic:[0,6,10],compon:1,con:10,condit:10,config:[1,8,18,19],configur:[7,11],conflict:[10,19],confus:11,connect:[0,4,5],connmark:1,consist:[1,4,5,10],constant:11,construct:[6,7,15,17],constructor:[5,12],consum:[17,20],consumpt:1,contain:[5,6,7,10,11,12,15,17],content:[5,6,11,12,20],context:[1,6,8,9,16],continu:10,contribut:[9,11],control:[1,5,7,10,11,16],convert:6,cooki:15,cope:10,copi:[1,2,4,5],copyright:2,core:[4,16],correct:1,correctli:[1,10,17],correspond:[0,5,6,10,15,16],cost:[10,11],count:11,counter:[1,5,12,17,20],coupl:5,cours:0,cover:[1,5,15],coverag:[1,7,13],cpu:[8,10,11,17],creat:[0,1,2,5,7,9,11,12,14,17,18,19,20],creation:[1,10,11],credit:2,critic:1,cstamp:15,ctrl:11,ctrlmsg:0,ctype:[3,16],current:[5,11,13,16,17],current_tx:10,curv:11,custom:[0,1,4,6,11,15],custom_socket_bas:4,custommessag:11,cycl:[1,11,13],daemon:[10,20],data:[0,1,4,5,8,9,11,12,13,15,17,19,20],databas:[4,10,11,14,16],date:10,deal:11,dealloc:1,deauthent:5,debug:[1,5,9,15,17],declar:[1,15],decod:[0,1,4,5,6,7,9,17],decor:20,dedic:[0,1,10,17],deepcopi:1,def:[4,11,17],defin:[2,4,5,6,10,15],definit:[5,6,11],defragment:[1,17],del:[10,11],del_interfac:5,del_ip:10,del_nh:10,del_port:10,delai:[10,17],delet:[1,5,10,11,12,18,20],deliv:8,delta:[1,17],demand:[1,11],deni:5,depend:[1,2,10,11],deploi:[13,17],deploy:13,deprec:[1,11,17],deriv:17,describ:[4,6,7,15,16],descript:[6,11,15],descriptor:16,design:10,despit:11,destin:[1,10,11],destroi:[5,11,12,20],destruct:1,detail:[3,6,7,10,11,15],determin:5,dev:[1,2,5,7,11],develop:[1,4,5,6,10,15],devic:[1,5,7,10,11,17,19],devlink:[1,7],dhcp4msg:[0,6],dhcp4socket:6,dhcp:[0,1],dhcpdiscov:6,dhcpmsg:[0,6],dhcprequest:6,dhcpv4:1,diagnost:1,diagram:[0,1,16],dict:[4,10,11,17],dictionari:[0,5,6,10,11,15,17,20],differ:[0,1,2,4,7,8,15,16,18],dimens:[5,12],dir:10,direct:[1,11,20],direct_act:11,directli:[10,15,19],directori:[4,5,12,13],disabl:1,disassoci:5,disciplin:9,disconnect:5,discov:[7,20],discoveri:[5,7],disk:7,displai:2,dist:9,distinguish:15,distribut:13,doc:[1,4,7,9,10],document:[1,4,7,9,11,20],doe:[0,5,6,10,11,12,16,20],doesn:[0,1,2,5,9,10,11,15,16],don:[5,7,17,20],done:[0,6,10,11,16,19],dot:2,dotkei:0,down:[1,10,11,16,17],dport:6,dquotsocket:7,draft:1,driver:11,drop:[1,10,11,16],drr:1,dst:[7,10,11,14],dst_len:11,dual:1,due:2,dummi:[1,2,11],dummy0:11,dump:[1,4,5,8,9,11,15,16],dure:[1,10],each:[5,11,12,13,15],earli:5,easi:[4,10,15],easier:[10,20],easiest:2,ecn:11,eexist:1,effect:[10,11],egg:13,egress:11,eht0:11,either:[2,10,11,13,15,17],elaps:8,element:[15,20],els:[8,10,11,19],elsewher:11,em1:[7,11],em2:7,emb:1,embed:1,emploi:[8,11],empti:[1,5,11,12,15,17],emul:[7,11],enabl:[4,5,7,12,20],encap:[0,1,7,11,14],encod:[0,1,6,7,11,17],end:[2,5,6,7,10,12,15,17],endian:[6,15],enforc:16,engin:5,enobuf:9,enough:[4,5,10,17,19],enqueu:17,ensur:10,entiti:11,entri:[5,12,20],environ:[18,19],equal:[10,11],equival:11,ericsson:1,errno:[1,17],error:[0,1,5,7,10,11,12,13,15,17],establish:0,etc:[0,2,4,5,6,10,11,12,13,15,17,18,20],eth0:[10,11,14],eth1:[10,11,14],eth2:[10,11],eth:[10,11],eth_p_al:11,ether:15,ethmsg:0,etyp:[5,12,20],even:[2,5,10,11,16,17],event:[1,7,10,11,15],eventlet:[1,4,9,13,18],eventlet_config:19,eventloop:[1,10],eventqueu:10,everi:[4,6,10,11,15,20],evolv:5,evq:10,exactli:0,exampl:[1,2,4,5,6,9,10,11,12,15,16,17,19,20],exce:17,except:[0,1,5,6,7,10,11,17,20],exclus:[5,10,12],execut:10,exist:[1,5,8,10,11,12,15,16],exit:[2,5,7,8,10,12,16],expect:[10,11,17],expens:20,experi:10,experiment:5,explicit:[10,11,15],explicitli:[1,10,11,15,16],extend:[0,6,7,17],extern:[0,10,11],extra:0,extrem:5,eye:10,f_getfl:16,fact:4,fail:[1,10,11,16,20],fals:[5,8,10,12,17,20],famili:[1,5,7,10,11,12,14,15,17,20],familiar:5,far:[5,6,10,17],fast:17,faster:17,fault:8,fcntl:16,fdb:[1,11],fe80:10,featur:[0,4,5,10,11,12],fedora:1,fff2:11,fff3:11,ffff:11,fibmsg:[0,11],field:[0,1,10,11,14,20],field_name1:15,field_namex:15,file:[1,2,4,5,8,11,12,13,16],fileno:[0,17],fill:[15,20],filter:[1,6,7,9,10,17],find:[5,6,10,15],first:[1,5,6,10,11,16,17],fit:6,fix:[1,4,6,10,11,15,17],fix_messag:4,flag:[1,2,5,10,11,15,16,17],flake8:[3,7],flat:1,flexibl:20,flock:16,flood:10,flush:[5,11,12,20],flush_addr:[1,11],flush_cach:5,flush_rout:[1,11],flush_rul:[1,11],follow:[2,5,6,10,11,15,20],foo:[5,11,12,20],foo_msg:15,foobar:[5,12],forc:[5,10,12],forceadd:[5,12],forget:[4,7,10,16,19],fork:1,form:[2,10,11,15],format:[2,4,6,10,14,15,17],forum:7,forward:[0,1,10,11],found:[4,20],four:[10,11],fq_codel:1,fr_act_nop:11,fr_act_unreach:11,frame:[5,8],framework:[0,4,6,7],free:17,freebsd:[0,11],freez:[1,10],freq:5,freq_fix:1,frequenc:5,friendli:[2,4,19],from:[0,1,2,4,5,6,7,8,11,12,13,14,15,16,17,18,19,20],from_netlink:20,fsc:11,full:[1,5,10,11,13,16],fun:[11,20],further:6,futur:10,fwmark:[1,11],gact:11,gatewai:[7,10,11,14],gcc:2,gener:[0,1,4,5,6,7,10,13,14,15,17,19],genericnetlinksocket:0,genl:1,genlmsg:[0,4],get:[0,1,5,6,7,11,12,13,14,15,16,17,19,20],get_:8,get_addr:[11,19],get_associated_bss:5,get_attr:[5,11,19],get_class:11,get_default_rout:11,get_filt:11,get_interface_by_ifindex:5,get_interface_by_phi:5,get_interfaces_dict:5,get_interfaces_dump:5,get_ipset_socket:20,get_link:[0,7,8,11,19],get_neighbour:11,get_ntabl:11,get_policy_map:17,get_qdisc:11,get_rout:[8,11,19],get_rul:11,get_stat:5,get_supported_revis:[5,12],get_vlan:[1,11],getenforc:16,getpid:[15,17],getprotobynam:[5,12],getsocknam:[2,4],getsockopt:17,getter:11,getvalu:0,gevent:18,gid:11,git:2,github:[1,3,4,5,7,10,14,18],give:10,given:[5,6,12,17],global:1,going:[0,5],googl:7,got:8,gplv2:1,gre:11,gre_iflag:11,gre_ikei:11,gre_loc:11,gre_oflag:11,gre_okei:11,gre_remot:11,gre_ttl:11,gretap:1,grex:11,group:[1,2,4,6,7,17],gtp:1,guarante:[0,5,12,15],gui:1,guid:[1,9],hack:11,had:11,half:1,hand:[5,12],handl:[0,1,2,5,8,10,11,19],happen:10,happi:4,hardwar:7,has:[4,5,6,7,10,11,12,16],hash:[1,5,12,20],hashsiz:[5,12,20],hashtabl:[5,12],hat:2,have:[0,1,2,5,6,7,8,10,11,12,15,16,18,19,20],header:[1,2,5,6,11,12,15,17],hello:19,help:[2,4,5,7,9,11,19,20],helper:20,here:[4,5,6,7,10,11,15,16],hesit:5,hex:[2,4,5,15],hexdump:2,hfsc:1,hfsc_curv:11,hide:0,hierarchi:[0,1,4,11],high:[0,4,7,11,15,20],hint:6,histor:10,hmac:7,home:[5,7],hood:19,hook:[10,13],hop:[10,11],hope:11,hoplimit:[7,10,11],host:[2,10],how:[0,2,4,5],howev:11,htb:1,htb_glob:11,htb_parm:11,html:13,http:[1,3,5,7,10,18],hundr:10,i386:1,i686:1,ibss:5,idea:0,identif:5,identifi:[10,11],idpb:14,ids:1,idx:[7,10,11,14,16],if_announcemsg:0,if_msg:0,if_slav:1,ifa_address:15,ifa_cacheinfo:15,ifa_famili:15,ifa_flag:15,ifa_index:15,ifa_label:11,ifa_loc:15,ifa_msg:0,ifa_msg_bas:0,ifa_pref:15,ifa_prefixlen:15,ifa_scop:15,ifa_unspec:15,ifa_valid:15,ifac:[5,10,12],ifaddrmsg:[0,11,15,17],ifalia:1,ifconfig:11,ifdb:10,ifi_chang:2,ifi_famili:2,ifi_flag:2,ifi_index:2,ifi_typ:[2,11,15],ifindex:[5,11],ifinfbas:0,ifinfmsg:[0,1,2,11,17],ifinfveth:0,ifla_af_spec:11,ifla_carri:11,ifla_group:11,ifla_ifnam:[11,15,19],ifla_info_data:[1,11],ifla_info_kind:11,ifla_linkinfo:11,ifla_linkmod:11,ifla_macvlan_macaddr:11,ifla_mtu:11,ifla_net_ns_fd:16,ifla_num_rx_queu:11,ifla_num_tx_queu:11,ifla_operst:11,ifla_promiscu:11,ifla_txqlen:11,ifla_wireless:15,iflag:11,ifma_msg:0,ifma_msg_bas:0,ifnam:[1,2,5,6,7,10,11,14,16],ifr:11,iftyp:5,ignor:[2,4,5,11,13,15,17],ignore_rt:10,iif:[10,11],iifnam:11,immedi:[5,8,10,13,17],implement:[0,1,4,5,6,7,10,11,12,16,17],impli:[10,20],implicit:[7,10,11],implicitli:16,improv:1,imq:11,incapsul:15,includ:[1,11,15,17],inclus:[5,12],incom:[0,5,6,11],incomplet:2,incorrect:1,increas:[1,17],indec:11,index:[1,2,5,7,9,10,11,14,15,16,17],indexerror:17,indic:11,info:[1,5,10,11,20],info_el:5,inform:[2,5,10,12,15,18,20],ingress:[1,11],inherit:[0,1,6,15],init:[0,1,11],initi:[1,5,6,10,15,20],inject:[11,14],inlin:7,inor:1,input:[8,10,11],insert:[10,20],insert_list:20,insid:2,inspect:[2,4,5,6],instal:[1,5,6,9,12,19],instanc:[6,10,13,16,17],instanti:[11,15,20],instead:[0,1,2,4,10,11,13,15,16,17,20],instruct:2,instrument:3,int32:6,intefac:10,integ:[5,10,11,12],integr:[1,11],intend:[2,4,11,16],intens:17,intention:6,interact:10,interest:[0,6],interfac:[0,1,5,6,7,9,11,14,15,18,19],interfer:10,intern:[1,10,11,13],internet:9,interpret:[6,16],intersect:1,intf:10,introduc:11,introduct:14,invalid:[5,11],invok:[10,17],involuntari:8,iobrok:1,iocor:1,ioctl:[0,11,16],ioloop:1,ip4addr:[4,15],ip4msg:0,ip6addr:15,ip6gr:11,ip6gre_:11,ipaddr:[1,7,10,15],ipaddrset:0,ipb:[2,11],ipbatch:[0,2,11],ipbatchsocket:0,ipc:1,ipdb:[1,4,7,9,15,16],ipdb_main:16,ipdb_test:16,ipq:[0,1,7],ipq_base_msg:0,ipq_mode_msg:[0,15],ipq_packet_msg:0,ipq_verdict_msg:0,ipqsocket:0,ipr:[0,2,4,7,8,11,14,16,17,19],iprout:[0,1,2,4,5,7,9,15,16,17,19],iproute2:[11,15],iproutemixin:[0,2],iprouterequest:11,iprsocket:[0,1,4,17],iprsocketmixin:0,ipset:[0,1,4,7,9,20],ipset_01:4,ipset_attr_adt:1,ipset_attr_data:1,ipset_cmd_list:4,ipset_cmd_protocol:4,ipset_msg:[0,4],ipstat:20,iptabl:[7,20],ipv4:[1,10,11,15],ipv6:[1,6,10,11,15],ipvlan:1,isinst:1,isol:1,issu:[1,3,4,5,7,9,14,16,18],issubclass:1,issuecom:10,item:[6,17],iter:[8,10,15,17],its:[2,4,6,11,15,16],itself:[0,4,5,7,10,11,15],iw_ev:15,iwutil:[0,1,4,5],job:8,join:10,join_ibss:5,just:[0,2,4,5,6,10,11,15,16,17,20],kbyte:8,keep:[10,11,13,15,16,17,18,19,20],kei:[0,1,4,6,10,11,14,17,20],kernel:[0,1,2,4,7,10,11,12,14,15,18,20],keyword:[1,10,11,20],kill_rtcach:10,kind:[2,7,10,11,16],knife:11,know:5,kwarg:[5,10,11,12,16,17,20],l2addr:[4,6,15],label:[7,9,11],lambda:[6,11,17],larg:20,last:[10,17,20],later:[0,2,6,10,11],latest:3,latter:10,launch:[13,17],layer:0,layout:[1,15,19],lazi:5,leak:[1,20],leakag:1,least:10,leav:[5,10,11],leave_ibss:5,lee:1,legal:1,len:[8,10,11,15],length:[2,5,11,15],less:[4,6],let:[0,1,4,5,8,11],letter:11,level:[0,4,7,10,11,13,15,17,20],lib:13,libc6:2,libc:16,librari:[0,2,3,4,5,6,7,8,10,11,16,17,19],licens:[1,2],like:[4,5,6,8,10,11,12,15,16,20],limit:[0,7,11],line:[2,13],link:[1,2,8,9,10,11,13,16],link_lookup:[7,11,14,16],linkedset:[0,1],linux:[0,2,7,10,11,14,18],list:[0,1,4,5,7,8,9,10,12,14,15,17,19,20],list_dev:5,list_wiphi:5,listen:1,listnetn:[7,16],liter:6,lladdr:11,lnst:13,load:[1,4,10,11,16,17,20],load_all_ipset:20,load_ipset:20,local:[1,2,10,11,13],locat:16,lock:10,lockf:16,log:17,logic:[0,1],logo:1,longer:10,look:[5,6,15,20],lookup:[7,10,11,16],loop:[1,10,17,20],loopback:[7,17],lose:10,lot:[8,19],low:[4,7,20],lower:[8,11],lowest:5,lucki:15,lwtunnel:[1,7,11],mac:[1,5,6,11,15],macaddr:10,machin:6,macvlan:[1,11],macvlan_mod:11,macvtap:[1,11],macvtap_mod:11,made:10,magic:0,mai:[1,8,10,11,15,19],main:[0,1,7,10,16,20],maintain:10,major:8,make:[1,2,3,5,7,10,11,13,15,17,18],makefil:[3,9],man:15,manag:[0,1,5,6,7,9,11,20],mandatori:[5,12,16],mani:[1,6,7,8,10,11,14,17,20],manipul:[4,7,20],manpag:[5,12],manual:[5,7,12,15,20],map:[1,7,15,20],mar:2,mark:[1,15],marshal:[2,9,19],mask:[1,2,10,11,15],masquerad:1,massiv:17,master:[1,11],match:[0,1,4,10,11],matter:15,max:[5,11,12],maxelem:[5,12],maximum:[5,8,12],mayb:7,mean:[0,5,6,10,11,15,17],meaningless:16,measur:18,mechan:11,member:[5,12,15],memori:[1,8,20],mention:[2,16],merg:[6,10],mesh_point:5,messag:[1,2,6,7,8,9,10,17,19,20],message_typ:6,method:[0,1,2,4,5,6,8,10,11,12,16,19],metric:[0,1,7,11],mhz:5,min:11,mind:[10,11,13,15,16,17,18,19],minimum:[5,12],minor:[1,8],mip:1,mir:1,mirror:1,mismatch:10,miss:[5,11],mitig:1,mix:[15,20],mixin:[0,11],mode:[1,7,9,11],model:1,modern:[10,11],modifi:[10,11],modprob:7,modul:[1,2,6,7,9,13,14,15,16,19],moment:[10,17],monitor:[1,5,7,10,11],monkey_patch:19,more:[1,2,3,4,5,6,7,8,10,11,12,15,16,17,19,20],moreov:10,most:10,mostli:[5,6,13,17],move:[1,6,7,9,19],movement:1,mpl:[1,7,9,11,15],mpls_iptunnel:[7,14],mpls_router:[7,14],mplsrout:0,mplstabl:0,msg:[0,6,10,11,15,17],msg_class:17,msg_controllen:[2,5],msg_flag:[0,2,5,17],msg_id1:17,msg_id:17,msg_iov:[2,4,5],msg_name:[2,4,5],msg_pid:17,msg_seq:17,msg_type:17,mtu:[7,10,11],much:[8,10,16,17,19],multi:1,multicast:[7,10,17],multipath:[1,11,14],multipl:[1,4,10],multiprocess:16,must:[0,3,5,6,7,12,15,17,20],mutabl:15,mvlan0:11,mvtap0:11,my_program:16,my_stat:10,myprog:11,myset:20,mysuperipset:20,name:[1,5,6,7,10,11,12,15,16,20],name_dst:[5,12],name_src:[5,12],namespac:[0,1,9,11],nativ:[7,17],natur:0,ndb:[1,11],ndmsg:[0,5,11,20],need:[5,6,10,11,15,17,18,20],need_ipset_socket:20,needed_attribut:10,neigh:11,neighbour:[1,11],neither:[5,10],nest:15,net:[1,5,7,11,12,14,20],net_ns_:1,net_ns_fd:[1,7,11,16],net_ns_pid:1,netem:1,netfilt:7,netlink:[1,4,5,6,7,10,11,12,16,20],netlink_listen_all_nsid:1,netlink_netfilt:[4,5,12],netlink_rout:2,netlink_sock_diag:1,netlinkerror:1,netlinkmixin:[0,17],netlinksocket:[0,1,17],netn:[0,1,4,7,9,11,19],netns_nam:16,network:[0,1,2,4,6,9,10,11,16,17],networkmanag:10,neutron:13,never:15,new_list:20,newdst:[7,14],newer:[5,12],newli:10,next:[0,1,6,19],nexthop:10,nexthopset:0,nfgen_famili:[5,12],nfgen_msg:0,nfnetlink:[0,1,2,4,5,7,12],nftabl:[1,7],nic:[11,19],nl80211:[0,1,2,4,5,7],nl80211_attr_gener:5,nl80211_attr_ifindex:5,nl80211_attr_ifnam:5,nl80211_attr_iftyp:5,nl80211_attr_mac:5,nl80211_attr_wdev:5,nl80211_attr_wiphi:5,nl80211cmd:[0,5],nl_async:10,nl_bind_group:10,nla:[0,1,4,5,11,15,16],nla_bas:0,nla_f_nest:15,nla_map:11,nla_nam:15,nla_name1:15,nla_namei:15,nla_namex:15,nla_typ:15,nlflag:0,nlm_f_ack:[5,11,15],nlm_f_creat:[11,15],nlm_f_excl:[11,15],nlm_f_request:[11,15],nlm_gener:8,nlm_request:[0,5,11],nlmsg:[0,1,2,4,11,15],nlmsg_atom:0,nlmsg_base:0,nlsock:15,nlsocket:[0,1,17],nmcli:10,node:11,non:[1,10,20],nonc:[1,15],none:[5,6,10,11,12,15,16,17,20],nope:16,nor:[5,10],normal:[1,10,11,16,17,19],nose:3,nosetest:[3,7,13],notat:[1,10,11,14,15],note:[5,9,10,12,15,17,20],noth:[6,16,20],notic:[2,4,5,7,10,11,14,15,16,17],notif:[0,7,11],now:[1,2,5,6,7,8,11],nslink:[0,16,19],nsname:[16,19],nsp:16,nspath:16,nspopen:[1,9],number:[2,6,11,14,15,16,17,20],nvie:3,o_creat:16,o_excl:16,obj:17,object:[0,1,4,5,7,8,10,11,12,15,16,17,19,20],obsolet:1,ocb:5,occasion:[5,10],occur:7,offset:[6,11],oflag:11,often:[5,10,12],oif:[7,10,11,14],oifnam:11,old:[1,10,11,20],older:2,onc:[2,8,10,17,20],one:[0,1,2,4,5,6,8,10,11,12,13,14,15,16,17,19,20],one_set:20,ones:[11,17],onli:[0,1,2,4,5,6,7,8,9,11,12,13,14,15,16,17,19,20],oop:1,open:[7,16,20],open_bpf_fd:11,open_netlink:20,openbsd:11,oper:[1,5,10,11,16,20],operst:11,optim:1,option:[1,5,8,10,11,12,13,15,17,20],options_hfsc:11,options_hfsc_class:11,order:[0,1,15,16],ordinari:[0,6,11],org:[3,5,7],other:[0,1,4,5,6,7,9,11,12,15,17,19,20],otherwis:[4,11],our:20,out:[5,6,10,17],outgo:[6,11],output:[1,2,4,8,10,11],outsid:[10,11],over:[0,1,11,17],overflow:17,overrid:11,overview:9,ovs:[0,1],own:[1,2,4,10,11,15],p2p:11,p2p_client:5,p2p_devic:5,p2p_go:5,p6p1:19,pack:[6,15],packag:[1,2,13,19],packet:[0,1,2,4,5,7,10,11,12,14,17,20],pad:[6,15],page:[3,4,8,9,14,15],pair:[0,7,10,11,16],paramet:[1,3,5,6,10,11,12,13,17,18,20],parameter_list:6,parent:[11,15],pars:[0,1,2,4,11,17,19,20],parser:[1,2,6,11,17],part:[4,5,11,12],parti:7,partial:1,particular:[1,5,11,17],particularli:5,partli:4,pass:[0,1,2,8,10,11,15,20],passthru:11,patch:[5,10],path:[1,10,13],pattern:13,payload:[11,15],pdb:13,peer:[1,7,11,16],pep8:3,percent:8,perform:[3,5,6,7,9,11,12,17],perman:11,permiss:5,permit:15,perturb:11,pf_local:2,pf_netlink:[2,4],pf_rout:[1,7,9,11],phy0:5,phy:5,pickl:1,pid:[2,4,5,11,15,17],pip:[2,7,19],pipe:[1,11,16],place:[4,10],plai:[0,17],plan:[10,17],platform:[1,7,11,16,18],platform_label:[7,14],pleas:[4,5,10,11,15,16,17,18],pls:[5,10],plug:1,plugin:[1,10,11],point:[10,11],polic:[1,11],polici:[1,4,6,10,11,17],poll:[0,6,10,11,16,17,19],pop:17,popen:16,port0:10,port:[1,4,5,6,7,9,11,12,17],port_entri:[5,12],port_rang:[5,12],portentri:[5,12],portrang:[5,12],possibl:[0,2,4,5,6,7,10,11,13,14,15,16,17,18,20],post:10,ppc64:1,pprint:[7,18],pre:[10,15],predic:[11,17],prefer:[5,11],preferr:0,prefix:[10,11],prefixlen:[7,10,11,15],prefsrc:11,prepar:[0,1,5],present:11,pretti:[0,8],prevent:10,previou:11,primari:[1,11,15],primarili:4,print:[7,10,11,14,16,17,19],prio:11,priomap:1,prior:[10,17],priorit:17,prioriti:[1,11,17],privat:11,probabl:[2,11,20],proc:[1,16],procedur:6,process:[1,2,7,9,10,11,13,15,17],produc:2,product:[5,17],profil:11,program:[5,10,11,17],progress:[1,7],project:[1,2,4,5,7,8,9,10,13,14,18],promote_secondari:15,proper:[0,15],properli:[5,10,11],properti:10,protinfo_bridg:11,proto:[2,11],protocol:[1,2,5,7,9,11,12,15],prototyp:1,provid:[0,1,2,4,5,6,7,10,11,12,15,16,17,18,19,20],proxi:[0,1,4,11,16],proxyarp:10,psched:1,ptrace:1,pull:[1,3,5],pure:7,purg:11,purpos:16,push:[1,7,14],put:[0,5,6,11,17],pvid:11,pwd:[2,4,5],pyinstal:1,pypi:[1,3,5,7],pyrout:2,pyroute2:[0,1,2,3,4,5,6,8,10,11,12,13,14,16,17,18,19,20],pyroute2_tests_ro:1,python2:[1,2],python3:[1,2,13],python:[1,2,3,4,5,7,8,10,13,15,16,17,18,19,20],pythonpath:[2,4,5],qdisc:[1,11],qopt:11,qpython:1,qsize:[10,17],quantum:11,queri:0,queu:17,queue:[0,1,7,9,10,17],quick:16,quickstart:9,quit:14,quota:7,race:[1,10],rais:[0,5,10,11,12,17],rang:[5,12,15,17],range_begin:11,range_end:11,rate:11,rational:4,raw:[2,5,6,11,17],rawiprout:[0,11],rawiprsocket:0,rawiprsocketmixin:0,rcvbuf:[10,17],react:10,read:[1,5,7,9,17],reader:[10,17],readi:10,readm:3,readthedoc:3,real:[11,19],realli:[10,15],realm:11,reason:[5,10,11,15,16],reason_cod:5,reassembl:1,receiv:[0,5,8,12,17,19],reclaim:8,recogn:10,record:[1,10,11],recreat:10,recurs:[4,11,15],recv:[0,2,5,11,16,17,19],recvmsg:[2,4,5],red:2,redhat:1,redirect:11,reduc:20,refactor:1,refer:[1,4,5,10,11,12,14,15,16,17],referenc:20,reflect:[10,11,14,19],regist:[0,17],register_callback:[10,17],register_polici:[4,17],regular:[10,11],reject:11,rel:1,relat:[1,5,12,13,16],releas:[1,7,9,10,16],relev:11,reli:[10,11],remot:[0,1,11],remotesocket:0,remov:[1,7,9,10,11,15,17,20],renam:[5,10,11,12],rep:1,replac:[1,11,16,17,20],replace_entri:20,repo:[2,13],report:[9,11,13],repres:[1,10,11,15],represent:6,req:[1,11,14],request:[0,1,2,3,4,5,8,10,11,14,15,16,17,20],requested_ip:6,requir:[0,1,2,4,5,8,9,10,11,13,14,15,16,17,18],reserv:[5,11,15,17],reset:[0,2,11,20],resid:[6,8,14],resolv:[1,15],resourc:[1,9,10,16,17,20],respect:1,respons:[0,1,2,5,8,9,15,16,17],rest:[2,6],restart:1,restart_on_error:10,restor:10,restrict:10,result:[0,5,8,11,17],retriev:[8,10,11],reus:1,revert:10,review:[1,10,16],revis:[1,5,12,20],rework:1,rhel6:1,rhel7:1,rhel:1,rhev:7,right:6,riprsocket:0,risk:10,roll:[7,10],root:[1,5,11,13,17,19],rout:[0,1,2,7,8,9,11,16],routekei:10,routin:[1,6,10,11,16,17],routingt:0,routingtableset:0,rpc:1,rpm:[1,2],rsc:11,rss:8,rt_msg:0,rt_msg_base:0,rt_proto:11,rt_scope:[11,15],rt_scope_host:11,rt_scope_link:11,rt_scope_nowher:11,rt_scope_sit:11,rt_scope_univers:11,rt_slot:0,rt_type:11,rta_flow:1,rta_via:1,rtab:1,rtax_hoplimit:[10,11],rtax_mtu:11,rtm_deladdr:17,rtm_dellink:17,rtm_delqdisc:11,rtm_getlink:[0,17],rtm_newaddr:[15,17],rtm_newlink:[10,11,15,17],rtm_newqdisc:11,rtmsg:[0,1,2,10,11],rtmsg_base:0,rtnetlink:[9,11],rtnl:[0,1,2,4,5,7,11,15,16,19],rtnl_api:[0,11],rtscope:11,rtt:10,rule:[0,1,2,6,9,11,17,20],rulekei:10,rulesdict:0,run:[0,2,3,4,5,7,8,10,11,13,16,17,18,19],runtim:[4,15,19],runtimeerror:10,s390x:1,sa_famili:[2,4,5],safe:[13,17],sai:[4,5,8,19],same:[0,1,2,4,5,10,11,15,16,17,19],sampl:[4,5,7,10,14,16],save:[11,17],scan:[5,15],sched_chok:11,sched_drr:11,sched_hfsc:11,sched_htb:11,schema:1,scheme:[10,11,17],school:11,scope:[1,2,11,15],script:[2,4,5,8,10],search:9,second:[5,8,11,17],secondari:11,section:6,see:[0,1,3,4,5,7,10,11,12,15,20],seen:6,seg6:7,seg:7,segment:5,select:[6,11,16,17,19],self:[0,4,11,17],selinux:[3,16],semant:16,send:[0,2,5,11,17],sendmsg:[5,19],sendto:[0,2,4,5,11,15,16,17],sens:0,sent:[2,6,8,11,20],separ:[1,5,10,12,15,16],seq:[15,17],sequenc:[1,2,10,15,17],sequence_numb:[0,2,5,11,15,17],serv:0,server:[1,6],server_id:6,servic:[1,5,11],session:[5,10],set:[0,1,2,4,7,8,9,10,11,12,13,14,15,17,20],set_a:[5,12],set_address:10,set_b:[5,12],set_mtu:10,set_nam:10,setn:[1,16],setsockopt:[2,17],setter:[8,11],setup:[1,5,10,11,19],setuptool:13,sever:[2,4,5,7,10,11,12,13,15,17,20],sfq:[1,11],shadow:1,share:[1,8,11],shell:[0,11],shellipr:[0,11],shortcut:[0,11,19],should:[0,2,3,4,5,6,8,10,11,12,14,15,16,17,20],shouldn:10,show:11,show_bug:1,shown:[2,11],shut:[10,16],shutdown:[1,10],signal:8,signatur:[1,11,19],signific:[4,10,19],similar:6,simpl:[0,1,4,5,10,11,12,15,16],simpler:[10,15],simplest:[4,9,10,17],simpli:8,simplic:19,simplifi:15,sinc:[2,5,7,10,11,12,13,15,20],singl:[1,14],siocgiwnam:15,siocgiwnwid:15,siocgiwscan:15,siocsiwcommit:15,siocsiwnwid:15,situat:10,size:[5,8,11,12],skbinfo:[5,12],skbmark:[5,12],skbprio:[5,12],skbqueue:[5,12],skip:[2,13,14,15],slow:20,slowli:6,small:20,sndbuf:[10,17],so_rcvbuf:[2,17],so_sndbuf:[1,2],sock:[6,11,20],sock_cloexec:2,sock_dgram:2,sock_diag:1,sock_raw:[2,4],socket:[1,2,4,5,7,8,9,11,12,14,15,16,20],sockopt:17,softwar:9,sol_socket:2,solut:[11,16,17],some:[0,1,2,3,4,5,6,7,8,10,11,14,15,16,17,19],some_attr:17,somenetn:16,someon:[7,10,11,20],someth:[4,5,17],sometim:[0,5,10,12,17,18,20],somewher:[4,19],soon:10,sort:1,sort_address:10,sourc:[1,5,11],space:[2,4,15,17],spare:17,spawn:9,spec:[1,10,11],special:[5,9,10,11,12],specif:[1,5,6,10,11,12,13,15,16,18,19],specifi:[2,5,6,10,11,12,15,16,17],speed:1,sphinx:[1,13],sql:1,src:[2,7,10,11],src_len:11,ssid:5,ssl:1,stab:11,stabl:19,stack:[8,10,11,14],stage:5,stai:[10,19],standalon:5,standard:[7,11,16],start:[0,1,2,4,7,10,11,16,17],startswith:10,startup:10,stat:11,state:[1,2,5,6,7,10,11,16,17],statement:[6,7,10,11],station:5,statist:[7,20],stats2:11,stats_app:11,statu:8,stderr:[1,16],stdin:[1,16],stdio:1,stdlib:7,stdout:[1,16],step:15,still:[1,2,5,16,17,20],stop:[1,10,16],store:[5,11,12,17,20],storm:[10,17],stp:10,str:[2,11],strace:[4,5,9],strang:20,stream:15,stress:17,strict:1,strictli:3,string:[2,4,5,6,10,11,12,14,15,16,17,20],strip:6,struct:[6,11,15],structur:[1,4,5,6,11,12,15],stuff:[0,1,2,16,20],stype:[5,12],sub:1,submit:14,subnet:11,subpackag:1,subprocess:16,subscrib:19,subset:7,subsystem:[11,15],sudo:[4,7,10,13,14,18,19],supplementari:0,support:[0,1,4,5,9,10,11,12,14,16,17,20],suppos:10,suppress:[10,17],sure:[2,6,10],surpris:4,svinota:[1,3,5,7,10,18],swap:[5,8,12,14,20],swiss:11,switchdev:11,symbol:[2,19],sync:[1,7,10],synchron:10,syntax:[1,6,11,13],sys:8,syscal:1,sysctl:[7,14,15],system:[0,1,5,6,8,9,10,11,13,16,18],systemd:5,tabl:[1,10,11,14],tag:11,take:[1,5,8,10,11,15],tap0:[10,11],tap:[1,11],tarbal:1,target:[1,5,7,9,11,15,16],task:[16,19],taskstat:[0,4,7],taskstatsmsg:0,tbf:1,tca_act_bpf:1,tca_u32_act:1,tcmd:0,tcmsg:[0,1,11],tcp:[1,5,12],team:11,teamd:0,temporari:20,term:10,termin:[15,17],test:[1,2,5,7,9,11,12,14,16,17,18,19,20],test_cas:13,test_fil:13,test_ipdb:[13,14],test_ipr:[13,14],test_list:20,test_netn:[11,16],test_platform:18,test_stress:13,testcapsrtnl:18,testclass:13,testexplicit:13,text:8,than:[5,10,17],thank:[1,5,12],thei:[0,2,4,5,6,10,11,12,14,15,17,19,20],them:[0,2,4,5,8,10,11,13,15,16,18,19],thereaft:[2,10],thermal:7,thermal_ev:[1,7],thi:[0,1,4,5,6,8,10,11,12,15,16,17,18,19,20],thing:10,think:4,those:11,though:[5,10,11,15,16],thousand:[8,10],thread:[1,10,11,17],threadless:1,three:[5,10,11,15],through:[0,11],thu:[4,7,10,11,16],time:[0,1,2,8,10,11,17,20],timeout:[1,5,10,12,20],timeoutexcept:1,tnum:10,tobyt:6,todo:11,togeth:11,tolist:6,too:[0,5,10,16],tool:[5,7,11,16,20],top:[7,11,16],tos:11,tostr:6,total:[6,8],touch:10,trace:[2,4,5],track:5,tracker:18,tradit:11,traffic:[5,7,10,11],transact:[0,1,6,7,9],transfer:16,transform:6,transit:1,translat:11,transpar:[0,4,7,11],transport:[0,1,4,7,17],treat:15,tree:15,tri:[10,11],trigger:5,tstamp:15,tstat:15,ttl:11,tun:[1,11],tune:11,tunnel:[7,11],tuntap:[0,1,11],tuntap_data:11,tupl:[5,10,12,15,17,20],turn:[8,10,16,17],tutori:10,two:[0,1,2,5,6,10,11,12,15,17],txqlen:[10,11],txt:11,type:[0,1,2,4,5,6,7,10,11,12,14,17,18,20],typic:16,typl:15,u32:1,udp4_pseudo_head:0,udp:[1,5,6,12],udp_proto:[5,12],udpmsg:0,uid:11,uint16:[11,15],uint32:[4,15],uint64:[6,15],uint8:[6,15],uint:15,unchang:11,undefin:10,under:[1,2,16,19],underli:11,understand:10,unfreez:10,unicast:[10,11],unicast_flood:11,unicod:1,unif:11,uniform:10,uniqu:[11,15],unit:1,univer:15,unix:[1,5],unknown:11,unless:[10,11],unlik:[5,10,11],unnecessari:10,unpack:15,unreach:[10,11],unregist:17,unregister_callback:17,unregister_polici:17,unshar:8,unsign:15,untag:11,until:[2,7,8,10,15],updat:[1,10,11,20],update_cont:20,update_dict_cont:20,update_state_by_msg:10,uplink:1,upon:[10,11,17],upper:11,upstream:11,url:2,usabl:5,usag:[1,3,11,14],usc:11,use:[0,1,2,3,4,5,7,8,10,11,12,13,15,16,17,19,20],usecas:9,used:[0,1,2,4,5,6,11,12,13,15,16,17,18],useful:[0,4,10,11,15],user:[0,1,4,5,6,8,10],userspac:[0,7,17],uses:[0,1,4,10,11,16],using:[0,1,4,5,6,10,11,12,13,17,20],usr:8,usual:[4,5,8,15],usus:11,utf:15,util:[0,1,5,7,10,11,13],uuid4:1,uuid:10,v0p0:[7,16],v0p1:[7,16],v100:11,v100c:11,v1p0:11,v1p1:11,v500:11,valid:[0,11],valu:[4,5,6,11,12,15,17,20],valuabl:5,variabl:[11,20],variant:[2,10],variou:20,vector:11,vepa:11,verdict:0,veri:[5,6,11,15,20],version:[1,2,5,12,15,18,19],veth0:[10,11],veth1:10,veth2:10,veth:[1,7,11,16],vfs_dquot:[1,7],via:[0,1,2,5,10,11,14,16,19],vid:11,view:[1,9],vim:3,virbr0:[2,10,19],virtual:[5,10,11],visibl:[11,13],vlan:[1,11],vlan_filt:[1,11],vlan_flag:1,vlan_id:11,vlan_info:11,vlan_protocol:11,vni:11,voluntari:8,vpn:10,vrf:[1,10,11],vrf_tabl:11,vx101:11,vx500:11,vxlan:[1,11],vxlan_data:11,vxlan_group:11,vxlan_id:11,vxlan_link:11,vxlan_ttl:11,wai:[0,4,5,6,10,11,15,16,17,19],wait:[1,7,10,16,19],wait_interfac:1,wait_ip:[1,7],wall:8,want:[2,4,5,10,11,15,17,20],warn:[5,12,17,20],wast:11,watchdog:1,wds:5,weight:10,weird:10,welcom:5,well:[4,10,15,16],were:[1,11,15],what:[2,5,10,11],when:[0,1,2,5,6,9,10,11,12,15,16,19,20],whenev:0,where:[0,10,11,13,14,15,16],whether:10,which:[5,10,11,16],whole:2,why:[2,10,11,16],wide:13,width:[5,6],wifi:5,window:10,wireless:[4,5,7,15],wiset:9,within:[0,6,9,10,11],without:[5,8,11,13,20],witout:10,wlan0:19,wlevel:13,wlp3s0:15,work:[0,1,2,3,4,5,6,7,8,10,12,15,16,20],workaround:[1,2,16,17,19],workflow:10,world:19,worst:16,would:[11,16],wrap:0,write:[6,10],written:19,wrong:16,wrote:4,x00:[2,4,5],x01:[2,4],x02:[2,4],x03:[2,4],x05:[2,4,5],x06:[2,4],x07:4,x10:2,x14:2,x18:2,x1a:2,x1b:5,x1c:4,x28:2,x30:5,x3c:2,x49:2,x55:2,x58:5,x61:2,x78:4,x84:2,x95:4,xe3:4,xe4:4,xid:6,xunit:1,yes:15,yet:[5,6,10,11,16],yield:10,you:[2,3,4,5,6,7,10,11,12,13,15,17,18,20],your:[2,5,10,11,12,15,18],yourself:5,zero:15},titles:["Module architecture","Changelog","Netlink debug howto","Project contribution guide","Modules layout","Modules in progress","DHCP support","Pyroute2","Generators","Pyroute2 netlink library","IPDB module","IPRoute module","IPSet module","Makefile documentation","MPLS howto","Netlink","Netns management overview","Base netlink socket and marshal","Report a bug","Quickstart","WiSet module"],titleterms:{"case":19,"class":[4,10,11,17],"default":10,"import":[4,19],The:[7,10],address:10,algo:15,api:[10,11],architectur:0,arrai:15,async:17,asynchron:17,attribut:15,base:17,basic:15,bridg:10,bsd:11,bug:18,cach:0,chang:5,changelog:1,choke:11,clean:13,clsact:11,commun:5,compat:2,compil:2,configur:8,context:10,contribut:3,creat:[10,15,16],daemon:5,data:2,debug:[2,4],decod:[2,15],defer:4,develop:[9,13],dhcp:6,differ:10,disciplin:11,disclaim:5,dist:13,doc:13,document:13,doesn:17,drr:11,dump:2,encod:15,enobuf:17,eventlet:19,exampl:7,field:[6,15],filter:11,from:10,gener:[8,9],get:10,guid:3,help:17,hfsc:11,hood:0,how:11,howto:[2,9,14],htb:11,indic:9,inform:9,instal:[7,13],interfac:[10,16],internet:0,ipdb:[0,10,14],iprout:[8,10,11,14],iproute2:10,ipset:[5,12],ipv4:6,issu:10,kernel:5,label:14,layout:4,librari:9,link:[3,7],list:[11,16],lwtunnel:14,makefil:13,manag:[10,16],mangl:0,marshal:[4,17],messag:[0,4,5,11,15],metric:10,mode:10,modul:[0,4,5,10,11,12,20],move:16,mpl:14,multipath:10,namespac:[7,16],netlink:[0,2,9,15,17],netlinksocket:4,netn:16,network:[5,7],nla_map:15,nlmsg_error:11,note:[2,11],nspopen:16,onli:10,option:6,other:[10,13],overview:16,packet:[6,15],pars:15,perform:10,persist:10,pf_rout:0,port:10,prioriti:10,problem:8,process:16,progress:5,project:3,protocol:[0,4,6],pyrout:5,pyroute2:[7,9,15],queue:11,quickstart:[10,19],read:10,releas:19,remov:16,report:18,requir:[3,7],resourc:19,respons:11,revers:5,rout:[10,14],rtnetlink:7,rule:10,send:15,set:[5,16],simplest:7,socket:[0,6,17,19],softwar:10,solut:8,spawn:16,special:19,strace:2,submit:5,support:[6,7],syntax:10,system:7,tabl:9,target:13,test:[3,13],thread:0,transact:10,type:15,u32:11,under:0,usag:9,usecas:7,util:4,view:10,when:17,wiset:20,within:16,work:11}}) \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/sm-interfaces.html 0.5.2-1/docs/html/sm-interfaces.html --- 0.4.21-0.1/docs/html/sm-interfaces.html 2017-09-01 19:37:25.000000000 +0000 +++ 0.5.2-1/docs/html/sm-interfaces.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,164 +0,0 @@ - - - - - - - - <no title> — pyroute2 0.4.21 documentation - - - - - - - - - - - - - - -
    -
    -
    -
    - -

    ??]?n???<?n????u??Eg??E[L??? -??h#K?D’?O?듔????lQT,3??X>?)?|? -??O??-“큤Y??7C??F?i???f?ۯ -?ß?~ -B??;O???>g??????????G?3?&)???????(?????@??????6W}J?p??D???N???<MVq0,?6t?$JR???n?f???z3?ui?c/?9??Ŀ????~<???K?V?],?,d$t??”?3?? -͆*cD??????[?x -k׍?eB~:?m>ln?b”pBl2,?? ?t???n?-??[vi????v??4?C??r?$??+MW?9?l?Gl? -?Z?bR????̏?c?@q?e???s?i -޸%?=?<???}?4]??kI???Y8?Ȯ?c????v??>?z?~p5?텇?%?N???* HV???4{F?ې]??z??؉).U?:g?k?n??? -???o$??Oi????͜$??ɔn??o???6ҾQ??O?( L????W?<S???FbBpk????z?u??ͷ?ƾ?’???)?q??G??????14?a???[?kxNi??ID??$????6?*>M???,?L???H8????F?6J??3?s???U??,ʪ?a4c1 ??e??4?<Ѻ?T????rY???S?(???QJH?}Ӕ?t_~]???0Z????l?et?E??G?B?Bé?V2?~[knǺ3?[^w?)ƴ,?v?QW???Ybl??v?*oˆi??xAv?K?;@???B??IL??-G?$?n??E?s??$Hds O!m?Gq?@?f0 -?aI?i??Qߑ)?VP}Tg댒????)?VX?^X?k???s}l?l$ -?nn?KDm?ܤ6?? , -”????IJ?n??9q?v??A? -$?]?4,K?CR??q?=(pO??&i?.Vo뀳?T0??Rt???W????ؚ4?,,?+? -???????Qp?7.?Ȃv???c9y”??? N?TnØIzJ??;?r?r??4??b?lk?>????q?Q?h??l??w?$?;> 7?????m?u冎??/ ?w;?W,??NsY{ ??C??? -{?p ?????_+??? -c?”?V?wa??????????r?{ ??[??[????q?? -M?& -??+?7???4kl.??*sj)e?)?M?mv[yJ3ڠՔ͙Yl? ?b???,?}???(荠ܰ 6>?d??G?lC??{l??? -u? -?,?cAuy?g?L??Q ?Vq@fl?u)? -r??o??? -R???y??%?? v???e? -???=?d??Wd?ǒ1?F?Ѫ Se???0 -a?BW]@R??W^?3?8?D?˟?[1Q?q?qpl????? -???f??TX?5?a?-??C&̡u?6?_??/.?}?W??A?????U?D?Di=^??`tg?<䷴_??-?? %OT(AC??B???L???T”OS???b?ݖC?/I?0??Ci?h6S?H?0?F?ȓ,??B?????4z?C&#?NI?dj-?fi?о~SJRr?SJR??p>?Ȓ???wr?????G??A.?ɋDҵy?@??R)L -Yo?%???LG?????!=???<??{????d -??CF]D??|; {?<??L???uĢ?X?<? -=?t;?CP??y????{I=^??y[?U??????sꅆ? -? -?=9d??-$?aG????c?#????~G,? -4???:??O? -WR??ҥy0 -????+m8???Db???>?J??Vru ??+1F?O?L?b -sp;?????Ig??hA???%??l????w??l???E?@?4?N?[?????9?l?F?T))?&??e?LI?)?]~Ty?+?L???J?N???Z?ك????AK?W????@?b{?V?*=?} ?3?$]?l?????H*d#?1;G??z???Lf?a[`Ύn,???x????0?????? -?r??? ?Ib?:q???g?1g -s???[?k?P?9p,?YGx?O ?j?IU.?)???M??<????#????}?? ? -??? -{??5?Nwлm?ګ???a?J0D?YU???8q.? -??v?,S?U?o??{??i?ۆx??n2=Gnˍ???ذ=?s?wϬ?!4??,?kJ? -Ge)5W??J?m????b,”?m??7?Ɣ5?}?/B?e?b?& -?????a??6?6?[1?8?E??? -???ce?? ,`Ց?-ZO -J??>??P???!b”GvFb??{???N?e????ΰ??$? ???9ǿO?7??????9??E??P?????@?????_X] -4V?

    -
    -
    ?Q??}=?uT]?l??yS޼?U?}?^???v?*?|SOR??P@??P?????k
    -

    ? -?z????

    -
    -
    8E?.:?6???ڧb??>??o??t?T?T???SQ ?SQ??’GTCy?^P
    -

    ?=o?Z??? ?S???wR??^??J?(??????IU?0r侷pC?r?ޡ?*??O?M?%?,?V1m? -????n??I?O?{?Aæ????* -??%>?????w????ri??U?s????????BW??vEajۦ+??s????2B7???7~??x????h?2?aN?; -”?W?”^!??o&Q?^????`s?L?[,B??%ɽ*??EG?T????kB????Б??7?? ??o?Q????]?I`?Tͦ?fS?L?I0?*j7??Mҁ -! -??Mʈy??M???<?-????` -!????^M?s&+j N2U]tu4??D]uR -^p=?®??’? -????k6p?*???Îs?B?.?P???? -R?†?]@2i -?oʏ -.Y?<E”?????GIX??ov ?G?? -???? h?}??Ӕ,??ҵ4?????W??;:?)/Ii./??Z?7Fm&O?`r ??0E? &????m?QP?j??7??B8y갹??=1O ??59E?K~?̓BL??I!حI?p?>L???Q)!?m??)!&? !?D??>???e? -?? ‘ -CK?L?????Xc?t ul?㜿b?a?A+Bc4_ V???UO|??’?F? -???\Ϟ???W????3j u?>??Cˇ~|Ky.?P??k??<\?d?? ?*_,?S?>v -³H?$?p?m3??\”dB\????{?c?!???? -?Cy?H5?F?)??E?)?<?.[R?’oX\”荙?tM??M`??0?!? w?’t#J??2T??g???????}????w? S???$?Q~,$0(\}|??J??ۋ_I?>JA[<??4eL?&.????35,?????G???o?`??”Aq?rwVa?jA?,?$P?^?r?????]eV?:??$?<(^????_| -?Q??r??

    - - -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/_sources/arch.rst.txt 0.5.2-1/docs/html/_sources/arch.rst.txt --- 0.4.21-0.1/docs/html/_sources/arch.rst.txt 2017-05-26 10:21:32.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/arch.rst.txt 2018-06-02 11:12:12.000000000 +0000 @@ -21,16 +21,16 @@ can use it in `poll()`. There is an inheritance diagram of netlink sockets, provided by the library: -.. inheritance-diagram:: pyroute2.iproute.IPRoute - pyroute2.iproute.IPBatch - pyroute2.iproute.RawIPRoute +.. inheritance-diagram:: pyroute2.iproute.linux.IPRoute + pyroute2.iproute.linux.IPBatch + pyroute2.iproute.linux.RawIPRoute pyroute2.iwutil.IW pyroute2.ipset.IPSet pyroute2.netlink.taskstats.TaskStats pyroute2.netlink.ipq.IPQSocket pyroute2.remote.Client pyroute2.remote.RemoteSocket - pyroute2.remote.Remote + pyroute2.remote.shell.ShellIPR pyroute2.netns.nslink.NetNS :parts: 1 @@ -71,10 +71,10 @@ messages as they arrive. The thread does socket behaviour: it will behave exactly in the same way, the only difference is that `recv()` will return already cached in the userspace message. To start the thread, -one should call `bind()` with `async=True`:: +one should call `bind()` with `async_cache=True`:: ipr = IPRoute() - ipr.bind(async=True) + ipr.bind(async_cache=True) ... # do some stuff ipr.close() @@ -147,6 +147,24 @@ The messages hierarchy: pyroute2.netlink.ipq.ipq_verdict_msg :parts: 1 +PF_ROUTE messages +================= + +PF_ROUTE socket is used to receive notifications from the BSD +kernel. The PF_ROUTE messages: + +.. inheritance-diagram:: pyroute2.bsd.pf_route.freebsd.bsdmsg + pyroute2.bsd.pf_route.freebsd.if_msg + pyroute2.bsd.pf_route.freebsd.rt_msg_base + pyroute2.bsd.pf_route.freebsd.ifa_msg_base + pyroute2.bsd.pf_route.freebsd.ifma_msg_base + pyroute2.bsd.pf_route.freebsd.if_announcemsg + pyroute2.bsd.pf_route.rt_slot + pyroute2.bsd.pf_route.rt_msg + pyroute2.bsd.pf_route.ifa_msg + pyroute2.bsd.pf_route.ifma_msg + :parts: 1 + IPDB ==== @@ -166,21 +184,21 @@ implements some useful transaction magic methods of the `Transactional` objects. .. inheritance-diagram:: pyroute2.ipdb.main.IPDB - pyroute2.ipdb.interface.Interface + pyroute2.ipdb.interfaces.Interface pyroute2.ipdb.linkedset.LinkedSet pyroute2.ipdb.linkedset.IPaddrSet - pyroute2.ipdb.route.NextHopSet - pyroute2.ipdb.route.Via - pyroute2.ipdb.route.Encap - pyroute2.ipdb.route.Metrics - pyroute2.ipdb.route.BaseRoute - pyroute2.ipdb.route.Route - pyroute2.ipdb.route.MPLSRoute - pyroute2.ipdb.route.RoutingTable - pyroute2.ipdb.route.MPLSTable - pyroute2.ipdb.route.RoutingTableSet - pyroute2.ipdb.rule.Rule - pyroute2.ipdb.rule.RuleSet + pyroute2.ipdb.routes.NextHopSet + pyroute2.ipdb.routes.Via + pyroute2.ipdb.routes.Encap + pyroute2.ipdb.routes.Metrics + pyroute2.ipdb.routes.BaseRoute + pyroute2.ipdb.routes.Route + pyroute2.ipdb.routes.MPLSRoute + pyroute2.ipdb.routes.RoutingTable + pyroute2.ipdb.routes.MPLSTable + pyroute2.ipdb.routes.RoutingTableSet + pyroute2.ipdb.rules.Rule + pyroute2.ipdb.rules.RulesDict :parts: 1 Internet protocols diff -pruN 0.4.21-0.1/docs/html/_sources/changelog.rst.txt 0.5.2-1/docs/html/_sources/changelog.rst.txt --- 0.4.21-0.1/docs/html/_sources/changelog.rst.txt 2017-09-01 19:37:21.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/changelog.rst.txt 2018-06-19 08:31:05.000000000 +0000 @@ -1,19 +1,39 @@ -changelog +Changelog ========= -* 0.4.21 - * ipdb: #416 -- workaround for the vrf_table issue -* 0.4.20 - * ipdb: #392 -- fix MPLS route key reference - * ipdb: #408 -- fix IPv6 routes in tables >= 256 - * ipdb: use tos as a route key -* 0.4.19 - * ipdb: global methods `review()`, `drop()`, `dump()`, `load()` - * ipdb: support VLAN protocol (802.1q, 802.1ad) - * ipdb: initial support for IPv6 rules +* 0.5.2 + * ndb: read-only DB prototype + * remote: support communication via stdio + * general: fix async keyword -- Python 3.7 compatibility + * + * + * iproute: support monitoring on BSD systems via PF_ROUTE + * rtnl: support for SQL schema in message classes + * nl80211: improvements + * + * + * + * netlink: support generators +* 0.5.1 + * ipdb: #310 -- route keying fix + * ipdb: #483, #484 -- callback internals change + * ipdb: #499 -- eventloop interface + * ipdb: #500 -- fix non-default :: routes + * netns: #448 -- API change: setns() doesn't remove FD + * netns: #504 -- fix resource leakage + * bsd: initial commits +* 0.5.0 + * ACHTUNG: ipdb commit logic is changed + * ipdb: do not drop failed transactions * ipdb: #388 -- normalize IPv6 addresses * ipdb: #391 -- support both IPv4 and IPv6 default routes + * ipdb: #392 -- fix MPLS route key reference * ipdb: #394 -- correctly work with route priorities + * ipdb: #408 -- fix IPv6 routes in tables >= 256 + * ipdb: #416 -- fix VRF interfaces creation + * ipset: multiple improvements + * tuntap: #469 -- support s390x arch + * nlsocket: #443 -- fix socket methods resolve order for Python2 * netns: non-destructive `netns.create()` * 0.4.18 * ipdb: #379 [critical] -- routes in global commits diff -pruN 0.4.21-0.1/docs/html/_sources/general.rst.txt 0.5.2-1/docs/html/_sources/general.rst.txt --- 0.4.21-0.1/docs/html/_sources/general.rst.txt 2017-09-01 19:37:21.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/general.rst.txt 2018-06-19 08:31:05.000000000 +0000 @@ -1,4 +1,4 @@ -pyroute2 +Pyroute2 ======== Pyroute2 is a pure Python **netlink** library. It requires only Python stdlib, @@ -17,15 +17,26 @@ protocols. Some supported netlink famili * **thermal_events** --- thermal events monitoring * **VFS_DQUOT** --- disk quota events monitoring -the simplest usecase +Starting with 0.5.2 the library supports also PF_ROUTE sockets on BSD systems. + +Supported systems +----------------- + +Pyroute2 runs natively on Linux and emulates some limited subset +of RTNL netlink API on BSD systems on top of PF_ROUTE notifications +and standard system tools. + +Other platforms are not supported. + +The simplest usecase -------------------- -The socket objects, provided by the library, are actual socket objects with a -little bit extended API. The additional functionality aims to: +The objects, provided by the library, are socket objects with an +extended API. The additional functionality aims to: * Help to open/bind netlink sockets * Discover generic netlink protocols and multicast groups -* Construct, encode and decode netlink messages +* Construct, encode and decode netlink and PF_ROUTE messages Maybe the simplest usecase is to monitor events. Disk quota events:: @@ -36,7 +47,7 @@ Maybe the simplest usecase is to monitor for message in ds.get(): print(message) -Or IPRoute:: +Get notifications about network settings changes with IPRoute:: from pyroute2 import IPRoute with IPRoute() as ipr: @@ -45,8 +56,8 @@ Or IPRoute:: for message in ipr.get(): print(message) -rtnetlink sample ----------------- +RTNetlink examples +------------------ More samples you can read in the project documentation. @@ -68,7 +79,7 @@ Some examples:: print(ip.get_links()) # create VETH pair and move v0p1 to netns 'test' - ip.link_create(ifname='v0p0', peer='v0p1', kind='veth') + ip.link('add', ifname='v0p0', peer='v0p1', kind='veth') idx = ip.link_lookup(ifname='v0p1')[0] ip.link('set', index=idx, @@ -109,6 +120,34 @@ Some examples:: dst=0x200, newdst=[0x200, 0x300]) + # create SEG6 tunnel encap mode + # Kernel >= 4.10 + ip.route('add', + dst='2001:0:0:10::2/128', + oif=idx, + encap={'type': 'seg6', + 'mode': 'encap', + 'segs': '2000::5,2000::6'}) + + # create SEG6 tunnel inline mode + # Kernel >= 4.10 + ip.route('add', + dst='2001:0:0:10::2/128', + oif=idx, + encap={'type': 'seg6', + 'mode': 'inline', + 'segs': ['2000::5', '2000::6']}) + + # create SEG6 tunnel inline mode with hmac + # Kernel >= 4.10 + ip.route('add', + dst='2001:0:0:22::2/128', + oif=idx, + encap={'type': 'seg6', + 'mode': 'inline', + 'segs':'2000::5,2000::6,2000::7,2000::8', + 'hmac':0xf}) + # release Netlink socket ip.close() @@ -158,8 +197,8 @@ namespaces:: The project contains several modules for different types of netlink messages, not only RTNL. -network namespace samples -------------------------- +Network namespace examples +-------------------------- Network namespace manipulation:: @@ -195,23 +234,24 @@ List interfaces in some **netns**:: More details and samples see in the documentation. -installation +Installation ------------ `make install` or `pip install pyroute2` -requires --------- +Requirements +------------ Python >= 2.7 The pyroute2 testing framework requires **flake8**, **coverage**, **nosetests**. -links +Links ----- -* home: https://github.com/svinota/pyroute2 +* home: https://pyroute2.org/ +* srcs: https://github.com/svinota/pyroute2 * bugs: https://github.com/svinota/pyroute2/issues * pypi: https://pypi.python.org/pypi/pyroute2 * docs: http://docs.pyroute2.org/ diff -pruN 0.4.21-0.1/docs/html/_sources/generator.rst.txt 0.5.2-1/docs/html/_sources/generator.rst.txt --- 0.4.21-0.1/docs/html/_sources/generator.rst.txt 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/generator.rst.txt 2018-06-12 13:51:43.000000000 +0000 @@ -0,0 +1,144 @@ +Generators +---------- + +Problem +======= + +Until 0.5.2 Pyroute2 collected all the responses in a list +and returned them at once. It may be ok as long as there is +not so many objects to return. But let's say there are some +thousands of routes:: + + $ ip ro | wc -l + 315417 + +Now we use a script to retrieve the routes:: + + import sys + from pyroute2 import config + from pyroute2 import IPRoute + + config.nlm_generator = (sys.argv[1].lower() + if len(sys.argv) > 1 + else 'false') == 'true' + + with IPRoute() as ipr: + for route in ipr.get_routes(): + pass + +If the library collects all the routes in a list and returns +the list, it may take a lot of memory:: + + $ /usr/bin/time -v python e.py false + Command being timed: "python e.py false" + User time (seconds): 30.42 + System time (seconds): 3.63 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:34.09 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 2416472 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 604787 + Voluntary context switches: 9 + Involuntary context switches: 688 + Swaps: 0 + File system inputs: 0 + File system outputs: 0 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +2416472 kbytes of RSS. Pretty much. + +Solution +======== + +Now we use generator to iterate the results:: + + $ /usr/bin/time -v python e.py true + Command being timed: "python e.py true" + User time (seconds): 18.48 + System time (seconds): 0.99 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:19.49 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 45132 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 433589 + Voluntary context switches: 9 + Involuntary context switches: 244 + Swaps: 0 + File system inputs: 0 + File system outputs: 0 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +45132 kbytes of RSS. That's the difference. Say we have a bit more +routes:: + + $ ip ro | wc -l + 678148 + +Without generators the script will simply run ot of memory. But with +the generators:: + + $ /usr/bin/time -v python e.py true + Command being timed: "python e.py true" + User time (seconds): 39.63 + System time (seconds): 2.78 + Percent of CPU this job got: 99% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:42.75 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 45324 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 925560 + Voluntary context switches: 11 + Involuntary context switches: 121182 + Swaps: 0 + File system inputs: 0 + File system outputs: 0 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +Again, 45324 kbytes of RSS. + +Configuration +============= + +To turn the generator option on, one should set ``pyroute2.config.nlm_generator`` +to ``True``. By default is ``False`` not to break existing projects.:: + + from pyroute2 import config + from pyroute2 import IPRoute + + config.nlm_generator = True + with IPRoute() as ipr: + for route in ipr.get_routes(): + handle(route) + +IPRoute and generators +====================== + +IPRoute objects will return generators only for methods that employ ``GET_...`` +requests like ``get_routes()``, ``get_links()``, ``link('dump', ...)``, ``addr('dump', ...)``. +Setters will work as usually to apply changes immediately. diff -pruN 0.4.21-0.1/docs/html/_sources/index.rst.txt 0.5.2-1/docs/html/_sources/index.rst.txt --- 0.4.21-0.1/docs/html/_sources/index.rst.txt 2017-05-26 10:21:32.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/index.rst.txt 2018-06-02 10:16:57.000000000 +0000 @@ -1,9 +1,6 @@ .. pyroute2 documentation master file -.. image:: ericsson.png - :align: right - -pyroute2 netlink library +Pyroute2 netlink library ======================== General information @@ -26,6 +23,8 @@ Usage usage iproute ipdb + wiset + ipset netns Howtos diff -pruN 0.4.21-0.1/docs/html/_sources/iproute.rst.txt 0.5.2-1/docs/html/_sources/iproute.rst.txt --- 0.4.21-0.1/docs/html/_sources/iproute.rst.txt 2017-05-26 10:21:32.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/iproute.rst.txt 2018-06-01 17:30:39.000000000 +0000 @@ -6,6 +6,17 @@ IPRoute module .. automodule:: pyroute2.iproute :members: +BSD notes +--------- + +.. automodule:: pyroute2.iproute.bsd + +IPRoute API +----------- + +.. automodule:: pyroute2.iproute.linux + :members: + Queueing disciplines -------------------- diff -pruN 0.4.21-0.1/docs/html/_sources/ipset.rst.txt 0.5.2-1/docs/html/_sources/ipset.rst.txt --- 0.4.21-0.1/docs/html/_sources/ipset.rst.txt 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/ipset.rst.txt 2018-05-20 09:28:47.000000000 +0000 @@ -0,0 +1,7 @@ +.. ipset: + +IPSet module +============== + +.. automodule:: pyroute2.ipset + :members: diff -pruN 0.4.21-0.1/docs/html/_sources/makefile.rst.txt 0.5.2-1/docs/html/_sources/makefile.rst.txt --- 0.4.21-0.1/docs/html/_sources/makefile.rst.txt 2017-09-01 19:37:21.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/makefile.rst.txt 2018-06-19 08:31:05.000000000 +0000 @@ -1,4 +1,4 @@ -makefile documentation +Makefile documentation ====================== Makefile is used to automate Pyroute2 deployment and test @@ -16,17 +16,6 @@ target: docs Build documentation. Requires `sphinx`. -target: epydoc --------------- - -Build API documentation. Requires `epydoc`. - -Pls notice that epydoc is discontinued. The reason to support -it here is that it performs additional API testing and helps -to highlight API inconsistencies. - -No issues regarding epydoc output format are accepted. - target: test ------------ @@ -70,17 +59,6 @@ It is possible to skip tests by a patter $ sudo make test skip=test_stress -target: test-ci ---------------- - -Run tests on isolated VMs defined by `tests/ci/configs/*xml`. - -Requires qemu, kvm, libvirt and civm script: https://github.com/svinota/civm - -Command line options: - -* civm -- path to the civm script (if it is not in `$PATH`) - target: dist ------------ diff -pruN 0.4.21-0.1/docs/html/_sources/report.rst.txt 0.5.2-1/docs/html/_sources/report.rst.txt --- 0.4.21-0.1/docs/html/_sources/report.rst.txt 2017-09-01 19:37:21.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/report.rst.txt 2018-06-19 08:31:05.000000000 +0000 @@ -1,4 +1,4 @@ -report a bug +Report a bug ============ In the case you have issues, please report them to the project Binary files 0.4.21-0.1/docs/html/_sources/sm-interfaces.rst.txt and 0.5.2-1/docs/html/_sources/sm-interfaces.rst.txt differ diff -pruN 0.4.21-0.1/docs/html/_sources/usage.rst.txt 0.5.2-1/docs/html/_sources/usage.rst.txt --- 0.4.21-0.1/docs/html/_sources/usage.rst.txt 2017-01-24 21:52:56.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/usage.rst.txt 2018-06-02 09:09:19.000000000 +0000 @@ -3,7 +3,19 @@ Quickstart ========== -Runtime +Hello, world:: + + $ sudo pip install pyroute2 + + $ cat example.py + from pyroute2 import IPRoute + with IPRoute() as ipr: + print([x.get_attr('IFLA_IFNAME') for x in ipr.get_links()]) + + $ python example.py + ['lo', 'p6p1', 'wlan0', 'virbr0', 'virbr0-nic'] + +Sockets ------- In the runtime pyroute2 socket objects behave as normal @@ -36,22 +48,15 @@ But pyroute2 objects have a lot of metho handle specific tasks:: from pyroute2 import IPRoute - from pyroute2 import IW # RTNL interface - ipr = IPRoute() + with IPRoute() as ipr: - # WIFI interface - iw = IW() + # get devices list + ipr.get_links() - # get devices list - ipr.get_links() - - # scan WIFI networks on wlo1 - iw.scan(ipr.link_lookup(ifname='wlo1')) - -More info on specific modules is written in the next -chapters. + # get addresses + ipr.get_addr() Resource release ---------------- @@ -60,39 +65,16 @@ Do not forget to release resources and c keep in mind, that the real fd will be closed only when the Python GC will collect closed objects. -Signal handlers ---------------- - -If you place exclusive operations in a signal handler, the -locking will not help. The only way to guard the handler is -to ignore the signal from the handler:: - - import signal - from pyroute2 import IPDB - - def handler(signum, frame): - # emergency shutdown - signal.signal(signal.SIGTERM, signal.SIG_IGN) - ipdb.interfaces.test_if.remove().commit() - ipdb.release() - - def main(): - with IPDB() as ipdb: - signal.signal(signal.SIGTERM, handler) - test_if = ipdb.create(ifname='test_if', kind='dummy').commit() - ... # do some work - Imports ------- -The public API is exported by `pyroute2/__init__.py`. There -are two main reasons for such approach. +The public API is exported by `pyroute2/__init__.py`. -First, it is done so to provide a stable API, that will not -be affected by changes in the package layout. There can be -significant layout changes between versions, but if a -symbol is re-exported via `pyroute2/__init__.py`, it will be -available with the same import signature. +It is done so to provide a stable API that will not be affected +by changes in the package layout. There may be significant +layout changes between versions, but if a symbol is re-exported +via `pyroute2/__init__.py`, it will be available with the same +import signature. .. warning:: All other objects are also available for import, but they @@ -114,31 +96,6 @@ E.g.:: from pyroute2 import NetNS ns = NetNS('test') -Another function of `pyroute2/__init__.py` is to provide -deferred imports. Being imported from the root of the -package, classes will be really imported only with the first -constructor call. This make possible to change the base -of pyroute2 classes on the fly. - -The proxy class, used in the second case, supports correct -`isinstance()` and `issubclass()` semantics, and in both -cases the code will work in the same way. - -There is an exception from the scheme: the exception classes. - -Exceptions ----------- - -Since the deferred import provides wrappers, not real classes, -one can not use them in `try: ... except: ...` statements. So -exception classes are simply reexported here. - -Developers note: new exceptions modules **must not** import any -other pyroute2 modules neither directly, nor indirectly. It means -that `__init__.py` files in the import path should not contain -pyroute2 symbols referred in the root module as that would cause -import error due to recursion. - Special cases ============= @@ -146,7 +103,7 @@ eventlet -------- The eventlet environment conflicts in some way with socket -objects, and pyroute2 provides a workaround for that:: +objects, and pyroute2 provides some workaround for that:: # import symbols # @@ -162,3 +119,6 @@ objects, and pyroute2 provides a workaro ns = NetNS('nsname') ns.get_routes() ... + +This may help, but not always. In general, the pyroute2 library +is not eventlet-friendly. diff -pruN 0.4.21-0.1/docs/html/_sources/wiset.rst.txt 0.5.2-1/docs/html/_sources/wiset.rst.txt --- 0.4.21-0.1/docs/html/_sources/wiset.rst.txt 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/docs/html/_sources/wiset.rst.txt 2018-05-20 09:28:47.000000000 +0000 @@ -0,0 +1,7 @@ +.. wiset: + +WiSet module +============ + +.. automodule:: pyroute2.wiset + :members: diff -pruN 0.4.21-0.1/docs/html/_static/basic.css 0.5.2-1/docs/html/_static/basic.css --- 0.4.21-0.1/docs/html/_static/basic.css 2017-09-01 19:37:26.000000000 +0000 +++ 0.5.2-1/docs/html/_static/basic.css 2018-06-19 08:31:09.000000000 +0000 @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -82,9 +82,21 @@ div.sphinxsidebar input { } div.sphinxsidebar #searchbox input[type="text"] { - width: 170px; + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; } + img { border: 0; max-width: 100%; @@ -199,6 +211,11 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ +div.body { + min-width: 450px; + max-width: 800px; +} + div.body p, div.body dd, div.body li, div.body blockquote { -moz-hyphens: auto; -ms-hyphens: auto; @@ -332,6 +349,11 @@ table.docutils { border-collapse: collapse; } +table.align-center { + margin-left: auto; + margin-right: auto; +} + table caption span.caption-number { font-style: italic; } @@ -398,6 +420,13 @@ table.field-list td, table.field-list th margin: 0; } +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + /* -- other body styles ----------------------------------------------------- */ ol.arabic { @@ -438,10 +467,14 @@ dd { margin-left: 30px; } -dt:target, .highlighted { +dt:target, span.highlighted { background-color: #fbe54e; } +rect.highlighted { + fill: #fbe54e; +} + dl.glossary dt { font-weight: bold; font-size: 1.1em; diff -pruN 0.4.21-0.1/docs/html/_static/classic.css 0.5.2-1/docs/html/_static/classic.css --- 0.4.21-0.1/docs/html/_static/classic.css 2017-07-05 10:57:29.000000000 +0000 +++ 0.5.2-1/docs/html/_static/classic.css 2018-06-02 08:19:35.000000000 +0000 @@ -1,264 +0,0 @@ -/* - * - * Sphinx stylesheet based on the default theme. - * - * :copyright: Copyright 2012 by Peter V. Saveliev - * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: sans-serif; - font-size: 100%; - color: #000; - margin: 0; - padding: 0; -} - -div.document { -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; - max-width: 45em; - padding: 2em; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #fafafa; - line-height: 30px; - border-top: 1px solid #c0c0c0; - border-bottom: 1px solid #c0c0c0; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - color: #355f7c; - font-size: 1.2em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h4 { - color: #355f7c; - font-size: 1.2em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #355f7c; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-weight: normal; - color: #20435c; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -img.align-right { - position: absolute; - right: 50px; - top: 50px; -} - -div.body p, div.body dd, div.body li { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -p.first { - margin: 2px; -} - -dl.class, dl.exception { - border-bottom: 1px dashed #ccc; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -cite { - background-color: #ececec; - color: #333333; - font-family: monospace; - font-style: normal; -} - -pre { - padding: 5px; - background-color: #eeffcc; - color: #333333; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -tt { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th { - background-color: #ede; -} - -.warning tt { - background: #efc2c2; -} - -.note tt { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} diff -pruN 0.4.21-0.1/docs/html/_static/custom.css 0.5.2-1/docs/html/_static/custom.css --- 0.4.21-0.1/docs/html/_static/custom.css 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/docs/html/_static/custom.css 2018-06-02 10:48:26.000000000 +0000 @@ -0,0 +1,277 @@ +/* + * + * Sphinx stylesheet based on the default theme. + * + * :copyright: Copyright 2012 by Peter V. Saveliev + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + color: #000; + margin: 0; + padding: 0; +} + +div.document { +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; + max-width: 45em; + padding: 2em; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #fafafa; + line-height: 30px; + border-top: 1px solid #c0c0c0; + border-bottom: 1px solid #c0c0c0; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + color: #355f7c; + font-size: 1.2em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h4 { + color: #355f7c; + font-size: 1.2em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +img.align-right { + position: absolute; + right: 50px; + top: 50px; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +p.first { + margin: 2px; +} + +dl.class, dl.exception { + border-bottom: 1px dashed #ccc; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; + border-radius: 10px; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +cite { + background-color: #ececec; + color: #333333; + font-family: monospace; + font-style: normal; +} + +pre { + padding: 5px; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; + border-radius: 10px; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +.highlight { + background: #f9f9f9; +} + +dl.method > dt { + margin-bottom: 1em; + padding: 1em; + border-left: solid 1px #ccc; + border-bottom: solid 1px #ccc; + border-radius: 10px; +} diff -pruN 0.4.21-0.1/docs/html/_static/doctools.js 0.5.2-1/docs/html/_static/doctools.js --- 0.4.21-0.1/docs/html/_static/doctools.js 2017-09-01 19:37:26.000000000 +0000 +++ 0.5.2-1/docs/html/_static/doctools.js 2018-06-19 08:31:09.000000000 +0000 @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -45,7 +45,7 @@ jQuery.urlencode = encodeURIComponent; * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { - if (typeof s == 'undefined') + if (typeof s === 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; @@ -66,29 +66,53 @@ jQuery.getQueryParameters = function(s) * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { - function highlight(node) { - if (node.nodeType == 3) { + function highlight(node, addItems) { + if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { - highlight(this); + highlight(this, addItems); }); } } - return this.each(function() { - highlight(this); + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; }; /* @@ -131,21 +155,21 @@ var Documentation = { * i18n support */ TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') + if (typeof translated === 'undefined') return string; - return (typeof translated == 'string') ? translated : translated[0]; + return (typeof translated === 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') + if (typeof translated === 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, @@ -180,7 +204,7 @@ var Documentation = { * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 */ fixFirefoxAnchorBug : function() { - if (document.location.hash) + if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); @@ -216,7 +240,7 @@ var Documentation = { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') + if (src.substr(-9) === 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); @@ -248,7 +272,7 @@ var Documentation = { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') + if (this === '..') parts.pop(); }); var url = parts.join('/'); diff -pruN 0.4.21-0.1/docs/html/_static/documentation_options.js 0.5.2-1/docs/html/_static/documentation_options.js --- 0.4.21-0.1/docs/html/_static/documentation_options.js 1970-01-01 00:00:00.000000000 +0000 +++ 0.5.2-1/docs/html/_static/documentation_options.js 2018-06-19 08:31:09.000000000 +0000 @@ -0,0 +1,9 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: '', + VERSION: '0.5.2', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' +}; \ No newline at end of file diff -pruN 0.4.21-0.1/docs/html/_static/jquery-3.1.0.js 0.5.2-1/docs/html/_static/jquery-3.1.0.js --- 0.4.21-0.1/docs/html/_static/jquery-3.1.0.js 2017-01-16 02:46:20.000000000 +0000 +++ 0.5.2-1/docs/html/_static/jquery-3.1.0.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,10074 +0,0 @@ -/*eslint-disable no-unused-vars*/ -/*! - * jQuery JavaScript Library v3.1.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2016-07-07T21:44Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.1.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.0 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-01-04 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - // Known :disabled false positives: - // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) - // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Check form elements and option elements for explicit disabling - return "label" in elem && elem.disabled === disabled || - "form" in elem && elem.disabled === disabled || - - // Check non-disabled form elements for fieldset[disabled] ancestors - "form" in elem && elem.disabled === false && ( - // Support: IE6-11+ - // Ancestry is covered for us - elem.isDisabled === disabled || - - // Otherwise, assume any non-