Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pyroute2 for openSUSE:Factory 
checked in at 2024-03-01 23:37:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pyroute2 (Old)
 and      /work/SRC/openSUSE:Factory/.python-pyroute2.new.1770 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pyroute2"

Fri Mar  1 23:37:35 2024 rev:28 rq:1153828 version:0.7.12

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pyroute2/python-pyroute2.changes  
2023-12-15 21:48:45.417400485 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-pyroute2.new.1770/python-pyroute2.changes    
    2024-03-01 23:37:36.453803162 +0100
@@ -1,0 +2,14 @@
+Fri Mar  1 09:54:09 UTC 2024 - Dirk Müller <dmuel...@suse.com>
+
+- update to 0.7.12:
+  * cli: move readline import to the script
+  * nl80211: decoder improvements
+  * remote: fix dump() on RemoteIPRoute
+  * ndb: add ensure() call
+  * ethtool: ring support
+    ndb: fix sources objects counting
+  * ethtool: ring support
+  * ndb: fix FDB records index
+  * ndb: fix sources objects counting
+
+-------------------------------------------------------------------

Old:
----
  pyroute2-0.7.10.tar.gz

New:
----
  pyroute2-0.7.12.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pyroute2.spec ++++++
--- /var/tmp/diff_new_pack.ml7B5U/_old  2024-03-01 23:37:36.969821821 +0100
+++ /var/tmp/diff_new_pack.ml7B5U/_new  2024-03-01 23:37:36.973821967 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-pyroute2
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-pyroute2
-Version:        0.7.10
+Version:        0.7.12
 Release:        0
 Summary:        Python Netlink library
 License:        Apache-2.0 OR GPL-2.0-or-later
@@ -30,7 +30,7 @@
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 Requires(post): update-alternatives
-Requires(postun):update-alternatives
+Requires(postun): update-alternatives
 BuildArch:      noarch
 Provides:       python-pyroute2.core = %{version}
 Obsoletes:      python-pyroute2.core < %{version}

++++++ pyroute2-0.7.10.tar.gz -> pyroute2-0.7.12.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/CHANGELOG.rst 
new/pyroute2-0.7.12/CHANGELOG.rst
--- old/pyroute2-0.7.10/CHANGELOG.rst   2023-11-30 09:11:55.000000000 +0100
+++ new/pyroute2-0.7.12/CHANGELOG.rst   2024-02-10 14:52:33.000000000 +0100
@@ -1,6 +1,18 @@
 Changelog
 =========
 
+* 0.7.12
+    * cli: move readline import to the script 
<https://github.com/svinota/pyroute2/pull/1165>
+    * ci: update tools versions <https://github.com/svinota/pyroute2/pull/1167>
+    * ci: generic make test target, update docs 
<https://github.com/svinota/pyroute2/pull/1173>
+    * ci: rename Linux python sessions in nox 
<https://github.com/svinota/pyroute2/pull/1172>
+    * nl80211: decoder improvements 
<https://github.com/svinota/pyroute2/pull/1168>
+    * remote: fix dump() on RemoteIPRoute 
<https://github.com/svinota/pyroute2/pull/1169>
+    * ndb: add ensure() call <https://github.com/svinota/pyroute2/pull/1171>
+* 0.7.11
+    * ethtool: ring support <https://github.com/svinota/pyroute2/pull/1152>
+    * ndb: fix FDB records index 
<https://github.com/svinota/pyroute2/pull/1158>
+    * ndb: fix sources objects counting 
<https://github.com/svinota/pyroute2/pull/1156>
 * 0.7.10
     * ss2: fix classful flow data 
<https://github.com/svinota/pyroute2/pull/1143>
     * ci: add Python versions 3.8 and 3.12, update platform versions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/PKG-INFO new/pyroute2-0.7.12/PKG-INFO
--- old/pyroute2-0.7.10/PKG-INFO        2023-11-30 09:16:18.270647000 +0100
+++ new/pyroute2-0.7.12/PKG-INFO        2024-02-10 16:04:20.602168800 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: pyroute2
-Version: 0.7.10
+Version: 0.7.12
 Summary: Python Netlink library
 Home-page: https://github.com/svinota/pyroute2
 Author: Peter Saveliev
@@ -17,12 +17,11 @@
 Classifier: Intended Audience :: System Administrators
 Classifier: Intended Audience :: Telecommunications Industry
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
 Classifier: Development Status :: 4 - Beta
 Description-Content-Type: text/x-rst
 License-File: LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/README.contribute.rst 
new/pyroute2-0.7.12/README.contribute.rst
--- old/pyroute2-0.7.10/README.contribute.rst   2023-03-15 11:10:02.000000000 
+0100
+++ new/pyroute2-0.7.12/README.contribute.rst   2024-02-10 14:17:37.000000000 
+0100
@@ -16,21 +16,13 @@
    #   git
    #   python
    #   GNU make, sed, awk
-   #
-   # then clone the repo
+
+   # clone the repo
    git clone ${pyroute2_git_url}
    cd pyroute2
 
-   # create and activate virtualenv
-   python -m venv venv
-   . venv/bin/activate
-
-   # update pip and install nox
-   pip install --upgrade pip
-   pip install nox
-
-   # run the test cycle
-   nox
+   # run the test suite
+   make test
 
 OpenBSD
 +++++++
@@ -38,33 +30,31 @@
 .. code-block:: sh
 
    # install required tools
-   pkg_add bash git gmake gsed python
+   pkg_add bash git gmake gsed python rust
 
    # clone the repo
    git clone ${pyroute_git_url}
    cd pyroute2
 
-   # create and activate virtualenv
-   python3.10 -m venv venv
-   . venv/bin/activate
-
-   # update pip and install nox
-   pip install --upgrade pip
-   pip install nox
+   # run the test suite
+   gmake test
 
-   # run the platform specific environment
-   nox -e openbsd
+Step 2: plan and implement the change
+-------------------------------------
 
-Step 2: make a change
----------------------
+The best practice is that any change should be covered by tests.
+The test suite is in the `/tests/` folder and is run by `nox`. You
+can add your tests to an existing tests module, or create your
+own module, if it requires some specific environment that is not
+covered yet. In the latter case add a new session to `noxfile.py`.
 
 The project is designed to work on the bare standard library.
 But some embedded environments strip even the stdlib, removing
 modules like sqlite3.
 
-So to run pyroute2 even in such environments, the project provdes
+So to run pyroute2 even in such environments, the project provides
 two packages, `pyroute2` and `pyroute2.minimal`, with the latter
-providing a minimal distribution, but using no sqlite3 or pickle.
+providing a minimal distribution, with no sqlite3 or pickle.
 
 Modules `pyroute2` and `pyroute2.minimal` are mutually exclusive.
 
@@ -74,18 +64,15 @@
 Step 3: test the change
 -----------------------
 
-Assume the environment is already set up on the step 1. Thus:
+Assume the environment is already set up on the step 1:
 
 .. code-block:: sh
 
-   # run code checks
-   nox -e linter
-
-   # run unit tests
-   nox -e unit
+   # run code linter
+   make format
 
-   # run functional test, some require root
-   nox -e linux-3.10
+   # run test suite, some tests may require root
+   make test
 
 Step 4: submit a PR
 -------------------
@@ -98,7 +85,7 @@
 
 The code must comply some requirements:
 
-* the library must work on Python >= 3.6.
-* the code must pass `nox -e linter`
-* the code must not break existing unit and functional tests
-* the `ctypes` usage must not break the library on SELinux
+* the library **must** work on Python >= 3.9
+* the code **must** pass `make format`
+* the code **must** not break existing unit and functional tests (`make test`)
+* the `ctypes` usage **must not** break the library on SELinux
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/VERSION new/pyroute2-0.7.12/VERSION
--- old/pyroute2-0.7.10/VERSION 2023-11-30 09:16:06.000000000 +0100
+++ new/pyroute2-0.7.12/VERSION 2024-02-10 16:04:01.000000000 +0100
@@ -1 +1 @@
-0.7.10
+0.7.12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/examples/generic/netl.py 
new/pyroute2-0.7.12/examples/generic/netl.py
--- old/pyroute2-0.7.10/examples/generic/netl.py        2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/examples/generic/netl.py        2024-01-29 
12:26:05.000000000 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 import traceback
 from pyroute2.netlink import NLM_F_REQUEST
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/examples/ndb/keystone_auth.py 
new/pyroute2-0.7.12/examples/ndb/keystone_auth.py
--- old/pyroute2-0.7.10/examples/ndb/keystone_auth.py   2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/examples/ndb/keystone_auth.py   2024-01-29 
12:26:05.000000000 +0100
@@ -40,7 +40,7 @@
 
     $ . openstack.rc  # <-- your OpenStack APIv3 RC file
     $ export PYTHONPATH=`pwd`
-    $ python examples/ndb/keystone_auth.py 14080769fe05e1f8b837fb43ca0f0ba4
+    $ python3 examples/ndb/keystone_auth.py 14080769fe05e1f8b837fb43ca0f0ba4
 
 Using this example you can implement services that export NDB via any RPC,
 e.g. HTTP, and use Keystone integration. Same scheme may be used for any
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/examples/ndb/radius_auth.py 
new/pyroute2-0.7.12/examples/ndb/radius_auth.py
--- old/pyroute2-0.7.10/examples/ndb/radius_auth.py     2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/examples/ndb/radius_auth.py     2024-01-29 
12:26:05.000000000 +0100
@@ -32,7 +32,7 @@
     export PYTHONPATH=`pwd`
 
     $ . radius.rc
-    $ python examples/ndb/radius_auth.py testing secret
+    $ python3 examples/ndb/radius_auth.py testing secret
 
 '''
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/examples/policy/policy.py 
new/pyroute2-0.7.12/examples/policy/policy.py
--- old/pyroute2-0.7.10/examples/policy/policy.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/examples/policy/policy.py       2024-01-29 
12:26:05.000000000 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 import traceback
 from pprint import pprint
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/examples/wifi/nl80211_interfaces.py 
new/pyroute2-0.7.12/examples/wifi/nl80211_interfaces.py
--- old/pyroute2-0.7.10/examples/wifi/nl80211_interfaces.py     2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/examples/wifi/nl80211_interfaces.py     2024-01-29 
12:26:05.000000000 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 #
 from pyroute2.iwutil import IW
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pr2modules/__init__.py 
new/pyroute2-0.7.12/pr2modules/__init__.py
--- old/pyroute2-0.7.10/pr2modules/__init__.py  2023-03-15 11:10:02.000000000 
+0100
+++ new/pyroute2-0.7.12/pr2modules/__init__.py  2024-02-07 10:51:28.000000000 
+0100
@@ -3,6 +3,7 @@
 
 It will be removed in 0.8.x
 '''
+
 import sys
 import warnings
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/bsd/util.py 
new/pyroute2-0.7.12/pyroute2/bsd/util.py
--- old/pyroute2-0.7.10/pyroute2/bsd/util.py    2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/bsd/util.py    2024-02-07 10:51:28.000000000 
+0100
@@ -6,6 +6,7 @@
 
 Maybe some day it will be ioctl. For now it's ifconfig and netstat.
 '''
+
 import re
 import socket
 import subprocess
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/cli/console.py 
new/pyroute2-0.7.12/pyroute2/cli/console.py
--- old/pyroute2-0.7.10/pyroute2/cli/console.py 2023-08-02 18:44:38.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/cli/console.py 2024-02-07 15:16:34.000000000 
+0100
@@ -6,17 +6,9 @@
 from pyroute2.cli.session import Session
 from pyroute2.ndb.main import NDB
 
-try:
-    import readline
-
-    HAS_READLINE = True
-except ImportError:
-    HAS_READLINE = False
-
 
 class Console(code.InteractiveConsole):
     def __init__(self, stdout=None, log=None, sources=None):
-        global HAS_READLINE
         self.db = NDB(log=log, sources=sources)
         self.db.config.update(
             {'show_format': 'json', 'recordset_pipe': 'true'}
@@ -28,10 +20,6 @@
         self.prompt = ''
         self.set_prompt()
         code.InteractiveConsole.__init__(self)
-        if HAS_READLINE:
-            readline.parse_and_bind('tab: complete')
-            readline.set_completer(self.completer)
-            readline.set_completion_display_matches_hook(self.display)
 
     def close(self):
         self.db.close()
@@ -92,6 +80,11 @@
                 self.showtraceback()
                 continue
 
+    def set_completer(self, readline):
+        readline.parse_and_bind('tab: complete')
+        readline.set_completer(self.completer)
+        readline.set_completion_display_matches_hook(self.display)
+
     def completer(self, text, state):
         if state == 0:
             d = [x for x in dir(self.session.ptr) if x.startswith(text)]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/common.py 
new/pyroute2-0.7.12/pyroute2/common.py
--- old/pyroute2-0.7.10/pyroute2/common.py      2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/common.py      2024-02-07 10:51:28.000000000 
+0100
@@ -199,7 +199,9 @@
     __var_name = re.compile('^[a-zA-Z_]+[a-zA-Z_0-9]*$')
 
     def __dir__(self):
-        return [i for i in self if type(i) == str and self.__var_name.match(i)]
+        return [
+            i for i in self if isinstance(i, str) and self.__var_name.match(i)
+        ]
 
     def __getattribute__(self, key, *argv):
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/config/version.py 
new/pyroute2-0.7.12/pyroute2/config/version.py
--- old/pyroute2-0.7.10/pyroute2/config/version.py      2023-11-30 
09:16:06.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/config/version.py      2024-02-10 
16:04:01.000000000 +0100
@@ -1 +1 @@
-__version__ = "0.7.10"
+__version__ = "0.7.12"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/dhcp/dhcp4socket.py 
new/pyroute2-0.7.12/pyroute2/dhcp/dhcp4socket.py
--- old/pyroute2-0.7.10/pyroute2/dhcp/dhcp4socket.py    2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/dhcp/dhcp4socket.py    2024-02-07 
10:51:28.000000000 +0100
@@ -3,6 +3,7 @@
 ================
 
 '''
+
 from pyroute2.common import AddrPool
 from pyroute2.dhcp.dhcp4msg import dhcp4msg
 from pyroute2.ext.rawsocket import RawSocket
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ethtool/ethtool.py 
new/pyroute2-0.7.12/pyroute2/ethtool/ethtool.py
--- old/pyroute2-0.7.10/pyroute2/ethtool/ethtool.py     2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ethtool/ethtool.py     2024-02-07 
10:51:28.000000000 +0100
@@ -13,7 +13,7 @@
 )
 from pyroute2.ethtool.ioctl import WAKE_NAMES, IoctlEthtool
 from pyroute2.netlink.exceptions import NetlinkError
-from pyroute2.netlink.generic.ethtool import NlEthtool
+from pyroute2.netlink.generic.ethtool import NlEthtool, ethtool_rings_msg
 
 INT32MINUS_UINT32 = c_uint32(-1).value
 INT16MINUS_UINT16 = c_uint16(-1).value
@@ -196,11 +196,9 @@
 
     @classmethod
     def from_ioctl(cls, link_settings):
-        (
-            map_supported,
-            map_advertising,
-            map_lp_advertising,
-        ) = IoctlEthtool.get_link_mode_masks(link_settings)
+        (map_supported, map_advertising, map_lp_advertising) = (
+            IoctlEthtool.get_link_mode_masks(link_settings)
+        )
         bits_supported = IoctlEthtool.get_link_mode_bits(map_supported)
         supported_ports = []
         supported_modes = []
@@ -257,6 +255,108 @@
         )
 
 
+class EthtoolRings(
+    namedtuple(
+        'EthtoolRings',
+        (
+            "rx_max",
+            "rx_mini_max",
+            "rx_jumbo_max",
+            "tx_max",
+            "rx",
+            "rx_mini",
+            "rx_jumbo",
+            "tx",
+            "rx_buf_len",
+            "tcp_data_split",
+            "cqe_size",
+            "tx_push",
+            "rx_push",
+            "tx_push_buf_len",
+            "tx_push_buf_len_max",
+        ),
+    )
+):
+    nl_attributs_dict = {
+        "rx_max": 'ETHTOOL_A_RINGS_RX_MAX',
+        "rx_mini_max": 'ETHTOOL_A_RINGS_RX_MINI_MAX',
+        "rx_jumbo_max": 'ETHTOOL_A_RINGS_RX_JUMBO_MAX',
+        "tx_max": 'ETHTOOL_A_RINGS_TX_MAX',
+        "rx": 'ETHTOOL_A_RINGS_RX',
+        "rx_mini": 'ETHTOOL_A_RINGS_RX_MINI',
+        "rx_jumbo": 'ETHTOOL_A_RINGS_RX_JUMBO',
+        "tx": 'ETHTOOL_A_RINGS_TX',
+        "rx_buf_len": 'ETHTOOL_A_RINGS_RX_BUF_LEN',
+        "tcp_data_split": 'ETHTOOL_A_RINGS_TCP_DATA_SPLIT',
+        "cqe_size": 'ETHTOOL_A_RINGS_CQE_SIZE',
+        "tx_push": 'ETHTOOL_A_RINGS_TX_PUSH',
+        "rx_push": 'ETHTOOL_A_RINGS_RX_PUSH',
+        "tx_push_buf_len": 'ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN',
+        "tx_push_buf_len_max": 'ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX',
+    }
+
+    def __new__(
+        cls,
+        rx_max=None,
+        rx_mini_max=None,
+        rx_jumbo_max=None,
+        tx_max=None,
+        rx=None,
+        rx_mini=None,
+        rx_jumbo=None,
+        tx=None,
+        rx_buf_len=None,
+        tcp_data_split=None,
+        cqe_size=None,
+        tx_push=None,
+        rx_push=None,
+        tx_push_buf_len=None,
+        tx_push_buf_len_max=None,
+    ):
+        return super(EthtoolRings, cls).__new__(
+            cls,
+            rx_max,
+            rx_mini_max,
+            rx_jumbo_max,
+            tx_max,
+            rx,
+            rx_mini,
+            rx_jumbo,
+            tx,
+            rx_buf_len,
+            tcp_data_split,
+            cqe_size,
+            tx_push,
+            rx_push,
+            tx_push_buf_len,
+            tx_push_buf_len_max,
+        )
+
+    @classmethod
+    def from_netlink(cls, nl_rings):
+        nl_rings = nl_rings[0]
+        return cls(
+            **{
+                cls_attr: nl_rings.get_attr(netlink_attr)
+                for cls_attr, netlink_attr in cls.nl_attributs_dict.items()
+            }
+        )
+
+    def to_netlink(self):
+        nl_rings_attrs = ethtool_rings_msg()
+        for cls_attr, netlink_attr in self.nl_attributs_dict.items():
+            attr = getattr(self, cls_attr)
+            if attr is not None:
+                nl_rings_attrs["attrs"].append((netlink_attr, attr))
+        return nl_rings_attrs
+
+    @classmethod
+    def from_ioctl(cls, ioctl_rings):
+        ioctl_rings = dict(ioctl_rings)
+        ioctl_rings.pop("cmd")
+        return cls(**ioctl_rings)
+
+
 class Ethtool:
     def __init__(self):
         self._with_ioctl = IoctlEthtool()
@@ -330,6 +430,31 @@
             wol_mode = self._with_ioctl.get_wol()
             return EthtoolWakeOnLan.from_ioctl(wol_mode)
 
+    def get_rings(self, ifname, with_netlink=None):
+        try:
+            rings = self._nl_exec(
+                self._with_nl.get_rings, with_netlink, ifname
+            )
+            rings = EthtoolRings.from_netlink(rings)
+        except UseIoctl:
+            self._with_ioctl.change_ifname(ifname)
+            rings_info = self._with_ioctl.get_rings()
+            rings = EthtoolRings.from_ioctl(rings_info)
+        return rings
+
+    def set_rings(self, ifname, with_netlink=None, **kwargs):
+        try:
+            rings = EthtoolRings(**kwargs).to_netlink()
+            self._nl_exec(self._with_nl.set_rings, with_netlink, rings, ifname)
+        except UseIoctl:
+            self._with_ioctl.change_ifname(ifname)
+            ioctl_rings = self._with_ioctl.get_rings()
+            for name, value in kwargs.items():
+                if name in ioctl_rings.keys() and ioctl_rings[name] != value:
+                    ioctl_rings[name] = value
+
+            self._with_ioctl.set_rings(ioctl_rings)
+
     def get_features(self, ifname):
         self._with_ioctl.change_ifname(ifname)
         return EthtoolFeatures.from_ioctl(self._with_ioctl.get_features())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ethtool/ioctl.py 
new/pyroute2-0.7.12/pyroute2/ethtool/ioctl.py
--- old/pyroute2-0.7.10/pyroute2/ethtool/ioctl.py       2023-10-27 
20:33:32.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ethtool/ioctl.py       2024-01-29 
12:26:05.000000000 +0100
@@ -23,6 +23,9 @@
 ETHTOOL_GSTATS = 0x0000001D
 ETH_GSTRING_LEN = 32
 
+ETHTOOL_GRINGPARAM = 0x00000010
+ETHTOOL_SRINGPARAM = 0x00000011
+
 ETHTOOL_GRXCSUM = 0x00000014
 ETHTOOL_SRXCSUM = 0x00000015
 ETHTOOL_GTXCSUM = 0x00000016
@@ -340,6 +343,21 @@
     _fields_ = [("off_flags", ctypes.c_uint32), ("features", EthtoolGfeatures)]
 
 
+class EthtoolRingParam(DictStruct):
+    _pack_ = 1
+    _fields_ = [
+        ("cmd", ctypes.c_uint32),
+        ("rx_max", ctypes.c_uint32),
+        ("rx_mini_max", ctypes.c_uint32),
+        ("rx_jumbo_max", ctypes.c_uint32),
+        ("tx_max", ctypes.c_uint32),
+        ("rx", ctypes.c_uint32),
+        ("rx_mini", ctypes.c_uint32),
+        ("rx_jumbo", ctypes.c_uint32),
+        ("tx", ctypes.c_uint32),
+    ]
+
+
 class IfReqData(ctypes.Union):
     dummy = generate_EthtoolGstrings(0)
     _fields_ = [
@@ -353,6 +371,7 @@
         ("sfeatures", ctypes.POINTER(EthtoolSfeatures)),
         ("glinksettings", ctypes.POINTER(IoctlEthtoolLinkSettings)),
         ("wolinfo", ctypes.POINTER(EthtoolWolInfo)),
+        ("rings", ctypes.POINTER(EthtoolRingParam)),
     ]
 
 
@@ -627,3 +646,14 @@
         self.ifreq.wolinfo = ctypes.pointer(cmd)
         self.ioctl()
         return cmd
+
+    def get_rings(self):
+        cmd = EthtoolRingParam(cmd=ETHTOOL_GRINGPARAM)
+        self.ifreq.rings = ctypes.pointer(cmd)
+        self.ioctl()
+        return cmd
+
+    def set_rings(self, rings):
+        rings.cmd = ETHTOOL_SRINGPARAM
+        self.ifreq.rings = ctypes.pointer(rings)
+        self.ioctl()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipdb/linkedset.py 
new/pyroute2-0.7.12/pyroute2/ipdb/linkedset.py
--- old/pyroute2-0.7.10/pyroute2/ipdb/linkedset.py      2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/ipdb/linkedset.py      2024-02-07 
10:51:28.000000000 +0100
@@ -1,5 +1,6 @@
 '''
 '''
+
 import struct
 import threading
 from collections import OrderedDict
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipdb/routes.py 
new/pyroute2-0.7.12/pyroute2/ipdb/routes.py
--- old/pyroute2-0.7.10/pyroute2/ipdb/routes.py 2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ipdb/routes.py 2024-02-07 10:51:28.000000000 
+0100
@@ -598,9 +598,9 @@
         if isinstance(labels, (list, tuple, set)):
             labels = '/'.join(
                 map(
-                    lambda x: str(x['label'])
-                    if isinstance(x, dict)
-                    else str(x),
+                    lambda x: (
+                        str(x['label']) if isinstance(x, dict) else str(x)
+                    ),
                     labels,
                 )
             )
@@ -659,9 +659,11 @@
                 if field == 'encap' and isinstance(v, (list, tuple, set)):
                     v = '/'.join(
                         map(
-                            lambda x: str(x['label'])
-                            if isinstance(x, dict)
-                            else str(x),
+                            lambda x: (
+                                str(x['label'])
+                                if isinstance(x, dict)
+                                else str(x)
+                            ),
                             v,
                         )
                     )
@@ -727,7 +729,7 @@
             ret = Transactional.__getitem__(self, key)
             # it doesn't
             # (plain dict can be safely discarded)
-            if (type(ret) == dict) or not ret:
+            if isinstance(ret, dict) or not ret:
                 # bake transactionals in place
                 if key == 'encap':
                     ret = Encap(parent=self)
@@ -822,7 +824,7 @@
     def __setitem__(self, key, value):
         if key == 'via' and isinstance(value, dict):
             # replace with a new transactional
-            if type(value) == Via:
+            if isinstance(value, Via):
                 with self._direct_state:
                     return BaseRoute.__setitem__(self, key, value)
             # or load the dict
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipdb/transactional.py 
new/pyroute2-0.7.12/pyroute2/ipdb/transactional.py
--- old/pyroute2-0.7.10/pyroute2/ipdb/transactional.py  2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ipdb/transactional.py  2024-02-07 
10:51:28.000000000 +0100
@@ -1,5 +1,6 @@
 '''
 '''
+
 import logging
 import threading
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/iproute/bsd.py 
new/pyroute2-0.7.12/pyroute2/iproute/bsd.py
--- old/pyroute2-0.7.10/pyroute2/iproute/bsd.py 2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/iproute/bsd.py 2024-02-07 10:51:28.000000000 
+0100
@@ -43,6 +43,7 @@
 `IPRoute.recv(...)` method returns valid netlink RTNL raw binary
 payload and `IPRoute.get(...)` returns parsed RTNL messages.
 '''
+
 import errno
 import os
 import select
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/iproute/windows.py 
new/pyroute2-0.7.12/pyroute2/iproute/windows.py
--- old/pyroute2-0.7.10/pyroute2/iproute/windows.py     2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/iproute/windows.py     2024-02-07 
10:51:28.000000000 +0100
@@ -10,6 +10,7 @@
     Using pyroute2 on Windows requires installing `win_inet_pton` module,
     you can use `pip install win_inet_pton`.
 '''
+
 import ctypes
 import os
 from socket import AF_INET
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ipset.py 
new/pyroute2-0.7.12/pyroute2/ipset.py
--- old/pyroute2-0.7.10/pyroute2/ipset.py       2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ipset.py       2024-02-07 10:51:28.000000000 
+0100
@@ -8,6 +8,7 @@
 It supports almost all kernel commands (create, destroy, flush,
 rename, swap, test...)
 '''
+
 import errno
 import socket
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/cli.py 
new/pyroute2-0.7.12/pyroute2/ndb/cli.py
--- old/pyroute2-0.7.10/pyroute2/ndb/cli.py     2023-03-15 11:10:02.000000000 
+0100
+++ new/pyroute2-0.7.12/pyroute2/ndb/cli.py     2024-02-07 15:16:34.000000000 
+0100
@@ -14,6 +14,10 @@
     from pyroute2.cli.auth.auth_radius import RadiusAuthManager
 except ImportError:
     RadiusAuthManager = None
+try:
+    import readline
+except ImportError:
+    readline = None
 
 
 def run():
@@ -61,6 +65,8 @@
         return 0
     else:
         console = Console(log=args.l, sources=sources)
+        if readline is not None:
+            console.set_completer(readline)
         if args.r:
             console.loadrc(args.r)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/main.py 
new/pyroute2-0.7.12/pyroute2/ndb/main.py
--- old/pyroute2-0.7.10/pyroute2/ndb/main.py    2023-08-02 18:44:38.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/main.py    2024-02-07 10:51:28.000000000 
+0100
@@ -278,6 +278,7 @@
     #            context manager's __exit__()
 
 '''
+
 import atexit
 import ctypes
 import ctypes.util
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/__init__.py 
new/pyroute2-0.7.12/pyroute2/ndb/objects/__init__.py
--- old/pyroute2-0.7.10/pyroute2/ndb/objects/__init__.py        2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/objects/__init__.py        2024-02-09 
23:09:58.000000000 +0100
@@ -61,6 +61,7 @@
 API
 ===
 '''
+
 import collections
 import errno
 import json
@@ -301,6 +302,9 @@
         self.knorm = self.schema.compiled[self.table]['norm_idx']
         self.spec = self.schema.compiled[self.table]['all_names']
         self.names = self.schema.compiled[self.table]['norm_names']
+        self.lookup_fallbacks = self.schema.compiled[self.table][
+            'lookup_fallbacks'
+        ]
         self.names_count = [self.names.count(x) for x in self.names]
         self.last_save = None
         if self.event_map is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/address.py 
new/pyroute2-0.7.12/pyroute2/ndb/objects/address.py
--- old/pyroute2-0.7.10/pyroute2/ndb/objects/address.py 2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/objects/address.py 2024-02-07 
10:51:28.000000000 +0100
@@ -155,6 +155,7 @@
 Please notice that address objects are read-only, you may not change them,
 only remove old ones, and create new.
 '''
+
 from pyroute2.netlink.rtnl.ifaddrmsg import ifaddrmsg
 from pyroute2.requests.address import AddressFieldFilter
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/interface.py 
new/pyroute2-0.7.12/pyroute2/ndb/objects/interface.py
--- old/pyroute2-0.7.10/pyroute2/ndb/objects/interface.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/objects/interface.py       2024-02-09 
23:09:58.000000000 +0100
@@ -655,6 +655,21 @@
         return self
 
     @check_auth('obj:modify')
+    def ensure_vlan(self, spec):
+        def do_ensure_vlan(self, mode, spec):
+            try:
+                method = getattr(self.vlan.create(spec), mode)
+                return [method()]
+            except KeyError:
+                return []
+            except Exception as e_s:
+                e_s.trace = traceback.format_stack()
+                return [e_s]
+
+        self._apply_script.append((do_ensure_vlan, {'spec': spec}))
+        return self
+
+    @check_auth('obj:modify')
     def del_vlan(self, spec):
         def do_del_vlan(self, mode, spec):
             try:
@@ -683,6 +698,23 @@
         return self
 
     @check_auth('obj:modify')
+    def ensure_neighbour(self, spec=None, **kwarg):
+        spec = spec or kwarg
+
+        def do_ensure_neighbour(self, mode, spec):
+            try:
+                method = getattr(self.neighbours.create(spec), mode)
+                return [method()]
+            except KeyError:
+                return []
+            except Exception as e_s:
+                e_s.trace = traceback.format_stack()
+                return [e_s]
+
+        self._apply_script.append((do_ensure_neighbour, {'spec': spec}))
+        return self
+
+    @check_auth('obj:modify')
     def del_neighbour(self, spec=None, **kwarg):
         spec = spec or dict(kwarg)
 
@@ -728,6 +760,23 @@
         return self
 
     @check_auth('obj:modify')
+    def ensure_ip(self, spec=None, **kwarg):
+        spec = spec or kwarg
+
+        def do_ensure_ip(self, mode, spec):
+            try:
+                method = getattr(self.ipaddr.create(spec), mode)
+                return [method()]
+            except KeyError:
+                return []
+            except Exception as e_s:
+                e_s.trace = traceback.format_stack()
+                return [e_s]
+
+        self._apply_script.append((do_ensure_ip, {'spec': spec}))
+        return self
+
+    @check_auth('obj:modify')
     def del_ip(self, spec=None, **kwarg):
         spec = spec or kwarg
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/neighbour.py 
new/pyroute2-0.7.12/pyroute2/ndb/objects/neighbour.py
--- old/pyroute2-0.7.10/pyroute2/ndb/objects/neighbour.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/objects/neighbour.py       2024-01-29 
12:26:05.000000000 +0100
@@ -48,8 +48,9 @@
 
 brmsg_schema = (
     ndmsg.sql_schema()
-    .unique_index('ifindex', 'NDA_LLADDR', 'NDA_VLAN')
+    .unique_index('ifindex', 'NDA_LLADDR', 'NDA_DST', 'NDA_VLAN')
     .constraint('NDA_LLADDR', "NOT NULL DEFAULT ''")
+    .constraint('NDA_DST', "NOT NULL DEFAULT ''")
     .constraint('NDA_VLAN', "NOT NULL DEFAULT 0")
     .foreign_key(
         'interfaces',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/objects/route.py 
new/pyroute2-0.7.12/pyroute2/ndb/objects/route.py
--- old/pyroute2-0.7.10/pyroute2/ndb/objects/route.py   2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/objects/route.py   2024-02-07 
10:51:28.000000000 +0100
@@ -107,6 +107,7 @@
 See here: :ref:`mpls`
 
 '''
+
 import json
 import struct
 import time
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/report.py 
new/pyroute2-0.7.12/pyroute2/ndb/report.py
--- old/pyroute2-0.7.10/pyroute2/ndb/report.py  2023-08-02 18:44:38.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/report.py  2024-02-07 10:51:28.000000000 
+0100
@@ -31,6 +31,7 @@
     2,'eth0','5254.0072.58b2','up'
 
 '''
+
 import json
 import warnings
 from itertools import chain
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/schema.py 
new/pyroute2-0.7.12/pyroute2/ndb/schema.py
--- old/pyroute2-0.7.10/pyroute2/ndb/schema.py  2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/schema.py  2024-02-09 23:09:58.000000000 
+0100
@@ -116,6 +116,7 @@
 all the tables from the DB, and NDB will create them from scratch
 on startup.
 '''
+
 import enum
 import json
 import random
@@ -460,6 +461,7 @@
             'fset': ','.join(f_set),
             'knames': ','.join(f_idx),
             'fidx': ' AND '.join(f_idx_match),
+            'lookup_fallbacks': iclass.lookup_fallbacks,
         }
 
     @publish
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/source.py 
new/pyroute2-0.7.12/pyroute2/ndb/source.py
--- old/pyroute2-0.7.10/pyroute2/ndb/source.py  2023-07-03 16:56:33.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/source.py  2024-02-07 10:51:28.000000000 
+0100
@@ -7,10 +7,21 @@
 starts with one local RTNL source names `localhost`::
 
     >>> ndb = NDB()
-    >>> ndb.sources.details()
-    {'kind': u'local', u'nlm_generator': 1, 'target': u'localhost'}
+    >>> ndb.sources.summary().format("json")
+    [
+        {
+            "name": "localhost",
+            "spec": "{'target': 'localhost', 'nlm_generator': 1}",
+            "state": "running"
+        },
+        {
+            "name": "localhost/nsmanager",
+            "spec": "{'target': 'localhost/nsmanager'}",
+            "state": "running"
+        }
+    ]
     >>> ndb.sources['localhost']
-    [running] <IPRoute {'nlm_generator': 1}>
+    [running] <IPRoute {'target: 'localhost', 'nlm_generator': 1}>
 
 The `localhost` RTNL source starts an additional async cache thread.
 The `nlm_generator` option means that instead of collections the
@@ -18,7 +29,7 @@
 consume memory regardless of the RTNL objects number::
 
     >>> ndb.sources['localhost'].nl.link('dump')
-    <generator object _match at 0x7fa444961e10>
+    <generator object RTNL_API.filter_messages at 0x7f61a99a34a0>
 
 See also: :ref:`iproute`
 
@@ -68,6 +79,7 @@
 
 See also: :ref:`remote`
 '''
+
 import errno
 import importlib
 import queue
@@ -180,6 +192,12 @@
         self.ndb.task_manager.db_add_nl_source(self.target, self.kind, spec)
         self.load_sql()
 
+    @classmethod
+    def _count(cls, view):
+        return view.ndb.task_manager.db_fetchone(
+            "SELECT count(*) FROM %s" % view.table
+        )
+
     @property
     def must_restart(self):
         if self.max_errors < 0 or self.errors_counter <= self.max_errors:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/transaction.py 
new/pyroute2-0.7.12/pyroute2/ndb/transaction.py
--- old/pyroute2-0.7.10/pyroute2/ndb/transaction.py     2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/ndb/transaction.py     2024-02-07 
10:51:28.000000000 +0100
@@ -183,6 +183,7 @@
 ---
 
 '''
+
 import logging
 import shlex
 import shutil
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/ndb/view.py 
new/pyroute2-0.7.12/pyroute2/ndb/view.py
--- old/pyroute2-0.7.10/pyroute2/ndb/view.py    2023-08-02 18:44:38.000000000 
+0200
+++ new/pyroute2-0.7.12/pyroute2/ndb/view.py    2024-02-09 23:09:58.000000000 
+0100
@@ -191,6 +191,17 @@
 
     @cli.change_pointer
     @check_auth('obj:modify')
+    def ensure(self, *argspec, **kwspec):
+        try:
+            obj = self.locate(**kwspec)
+        except KeyError:
+            obj = self.create(**kwspec)
+        for key, value in kwspec.items():
+            obj[key] = value
+        return obj
+
+    @cli.change_pointer
+    @check_auth('obj:modify')
     def add(self, *argspec, **kwspec):
         self.log.warning(
             '''\n
@@ -266,11 +277,17 @@
         iclass = self.classes[table]
         spec = iclass.new_spec(spec)
         kspec = self.ndb.schema.compiled[table]['norm_idx']
+        lookup_fallbacks = self.ndb.schema.compiled[table]['lookup_fallbacks']
         request = {}
         for name in kspec:
             name = iclass.nla2name(name)
             if name in spec:
                 request[name] = spec[name]
+            elif name in lookup_fallbacks:
+                fallback = lookup_fallbacks[name]
+                if fallback in spec:
+                    request[fallback] = spec[fallback]
+
         if not request:
             raise KeyError('got an empty key')
         return self[request]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/__init__.py 
new/pyroute2-0.7.12/pyroute2/netlink/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netlink/__init__.py    2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/__init__.py    2024-02-09 
23:09:58.000000000 +0100
@@ -834,6 +834,7 @@
     sql_constraints = {}
     sql_extra_fields = ()
     sql_extend = ()
+    lookup_fallbacks = {}
     nla_flags = 0  # NLA flags
     value_map = {}
     is_nla = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/devlink/__init__.py 
new/pyroute2-0.7.12/pyroute2/netlink/devlink/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netlink/devlink/__init__.py    2023-08-02 
18:44:38.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/devlink/__init__.py    2024-02-07 
10:51:28.000000000 +0100
@@ -2,6 +2,7 @@
 devlink module
 ==============
 '''
+
 from pyroute2.common import map_namespace
 from pyroute2.netlink import genlmsg, nla
 from pyroute2.netlink.generic import GenericNetlinkSocket
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/diag/ss2.py 
new/pyroute2-0.7.12/pyroute2/netlink/diag/ss2.py
--- old/pyroute2-0.7.10/pyroute2/netlink/diag/ss2.py    2023-11-30 
08:55:26.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/diag/ss2.py    2024-02-07 
10:51:28.000000000 +0100
@@ -528,7 +528,7 @@
         vessel[info_k] = {}
 
         # BUG - pyroute2 diag - seems always last info instance from kernel
-        if type(tcp_info_raw) != str:
+        if not isinstance(tcp_info_raw, str):
             for k, v in tcp_info_raw.items():
                 if k not in info_refine_tabl:
                     continue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/event/acpi_event.py 
new/pyroute2-0.7.12/pyroute2/netlink/event/acpi_event.py
--- old/pyroute2-0.7.10/pyroute2/netlink/event/acpi_event.py    2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/event/acpi_event.py    2024-02-07 
10:51:28.000000000 +0100
@@ -24,6 +24,7 @@
      'type': 32768}
 
 '''
+
 from pyroute2.common import load_dump
 from pyroute2.netlink import genlmsg, nla
 from pyroute2.netlink.event import EventSocket
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/event/dquot.py 
new/pyroute2-0.7.12/pyroute2/netlink/event/dquot.py
--- old/pyroute2-0.7.10/pyroute2/netlink/event/dquot.py 2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/event/dquot.py 2024-02-07 
10:51:28.000000000 +0100
@@ -23,6 +23,7 @@
 
     quota warning 8 for uid 0 on 7:0
 '''
+
 from pyroute2.common import load_dump
 from pyroute2.netlink import genlmsg
 from pyroute2.netlink.event import EventSocket
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/event/thermal.py 
new/pyroute2-0.7.12/pyroute2/netlink/event/thermal.py
--- old/pyroute2-0.7.10/pyroute2/netlink/event/thermal.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/event/thermal.py       2024-02-07 
10:51:28.000000000 +0100
@@ -1,5 +1,6 @@
 '''
 '''
+
 from enum import Enum
 
 from pyroute2.netlink import genlmsg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/generic/ethtool.py 
new/pyroute2-0.7.12/pyroute2/netlink/generic/ethtool.py
--- old/pyroute2-0.7.10/pyroute2/netlink/generic/ethtool.py     2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/generic/ethtool.py     2024-01-29 
12:26:05.000000000 +0100
@@ -1,4 +1,10 @@
-from pyroute2.netlink import NLA_F_NESTED, NLM_F_REQUEST, genlmsg, nla
+from pyroute2.netlink import (
+    NLA_F_NESTED,
+    NLM_F_ACK,
+    NLM_F_REQUEST,
+    genlmsg,
+    nla,
+)
 from pyroute2.netlink.exceptions import NetlinkError
 from pyroute2.netlink.generic import GenericNetlinkSocket
 
@@ -16,6 +22,12 @@
 ETHTOOL_MSG_DEBUG_SET = 8
 ETHTOOL_MSG_WOL_GET = 9
 ETHTOOL_MSG_WOL_SET = 10
+ETHTOOL_MSG_FEATURES_GET = 11
+ETHTOOL_MSG_FEATURES_SET = 12
+ETHTOOL_MSG_PRIVFLAGS_GET = 13
+ETHTOOL_MSG_PRIVFLAGS_SET = 14
+ETHTOOL_MSG_RINGS_GET = 15
+ETHTOOL_MSG_RINGS_SET = 16
 
 
 class ethtoolheader(nla):
@@ -149,6 +161,30 @@
     ethtoolbitset = ethtoolbitset
 
 
+class ethtool_rings_msg(genlmsg):
+    nla_map = (
+        ('ETHTOOL_A_RINGS_UNSPEC', 'none'),
+        ('ETHTOOL_A_RINGS_HEADER', 'ethtoolheader'),
+        ('ETHTOOL_A_RINGS_RX_MAX', 'uint32'),
+        ('ETHTOOL_A_RINGS_RX_MINI_MAX', 'uint32'),
+        ('ETHTOOL_A_RINGS_RX_JUMBO_MAX', 'uint32'),
+        ('ETHTOOL_A_RINGS_TX_MAX', 'uint32'),
+        ('ETHTOOL_A_RINGS_RX', 'uint32'),
+        ('ETHTOOL_A_RINGS_RX_MINI', 'uint32'),
+        ('ETHTOOL_A_RINGS_RX_JUMBO', 'uint32'),
+        ('ETHTOOL_A_RINGS_TX', 'uint32'),
+        ('ETHTOOL_A_RINGS_RX_BUF_LEN', 'uint32'),
+        ('ETHTOOL_A_RINGS_TCP_DATA_SPLIT', 'uint8'),
+        ('ETHTOOL_A_RINGS_CQE_SIZE', 'uint32'),
+        ('ETHTOOL_A_RINGS_TX_PUSH', 'uint8'),
+        ('ETHTOOL_A_RINGS_RX_PUSH', 'uint8'),
+        ('ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN', 'uint32'),
+        ('ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX', 'uint32'),
+    )
+
+    ethtoolheader = ethtoolheader
+
+
 class NlEthtool(GenericNetlinkSocket):
     def _do_request(self, msg, msg_flags=NLM_F_REQUEST):
         return self.nlm_request(msg, msg_type=self.prid, msg_flags=msg_flags)
@@ -231,3 +267,24 @@
 
         self.bind(ETHTOOL_GENL_NAME, ethtool_wol_msg)
         return self._do_request(msg)
+
+    def get_rings(self, ifname=None, ifindex=None):
+        msg = ethtool_rings_msg()
+        msg["cmd"] = ETHTOOL_MSG_RINGS_GET
+        msg["version"] = ETHTOOL_GENL_VERSION
+        msg["attrs"].append(
+            ('ETHTOOL_A_RINGS_HEADER', self._get_dev_header(ifname, ifindex))
+        )
+
+        self.bind(ETHTOOL_GENL_NAME, ethtool_rings_msg)
+        return self._do_request(msg)
+
+    def set_rings(self, rings, ifname=None, ifindex=None):
+        rings["cmd"] = ETHTOOL_MSG_RINGS_SET
+        rings["version"] = ETHTOOL_GENL_VERSION
+        rings["attrs"].append(
+            ('ETHTOOL_A_RINGS_HEADER', self._get_dev_header(ifname, ifindex))
+        )
+
+        self.bind(ETHTOOL_GENL_NAME, ethtool_rings_msg)
+        return self._do_request(rings, msg_flags=NLM_F_REQUEST | NLM_F_ACK)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/generic/wireguard.py 
new/pyroute2-0.7.12/pyroute2/netlink/generic/wireguard.py
--- old/pyroute2-0.7.10/pyroute2/netlink/generic/wireguard.py   2023-08-02 
18:44:38.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/generic/wireguard.py   2024-02-07 
10:51:28.000000000 +0100
@@ -63,7 +63,6 @@
     }
 '''
 
-
 import errno
 import logging
 import struct
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/ipq/__init__.py 
new/pyroute2-0.7.12/pyroute2/netlink/ipq/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netlink/ipq/__init__.py        2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/ipq/__init__.py        2024-02-07 
10:51:28.000000000 +0100
@@ -11,6 +11,7 @@
 `NF_ACCEPT`, and the packet will be pass the
 rule.
 '''
+
 from pyroute2.netlink import NLM_F_REQUEST, nlmsg
 from pyroute2.netlink.nlsocket import Marshal, NetlinkSocket
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/nl80211/__init__.py 
new/pyroute2-0.7.12/pyroute2/netlink/nl80211/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netlink/nl80211/__init__.py    2023-08-02 
18:44:38.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/nl80211/__init__.py    2024-02-07 
14:35:28.000000000 +0100
@@ -4,6 +4,7 @@
 
 TODO
 '''
+
 import datetime
 import struct
 
@@ -217,13 +218,13 @@
     'NL80211_SCAN_FLAG_', globals()
 )
 
-NL80211_STA_FLAG_AUTHORIZED = 1
-NL80211_STA_FLAG_SHORT_PREAMBLE = 2
-NL80211_STA_FLAG_WME = 3
-NL80211_STA_FLAG_MFP = 4
-NL80211_STA_FLAG_AUTHENTICATED = 5
-NL80211_STA_FLAG_TDLS_PEER = 6
-NL80211_STA_FLAG_ASSOCIATED = 7
+NL80211_STA_FLAG_AUTHORIZED = 1 << 1
+NL80211_STA_FLAG_SHORT_PREAMBLE = 1 << 2
+NL80211_STA_FLAG_WME = 1 << 3
+NL80211_STA_FLAG_MFP = 1 << 4
+NL80211_STA_FLAG_AUTHENTICATED = 1 << 5
+NL80211_STA_FLAG_TDLS_PEER = 1 << 6
+NL80211_STA_FLAG_ASSOCIATED = 1 << 7
 (STA_FLAG_NAMES, STA_FLAG_VALUES) = map_namespace(
     'NL80211_STA_FLAG_', globals()
 )
@@ -943,9 +944,9 @@
                         data = data[16:]
 
                 if len(data) >= 4:
-                    rsn_values[
-                        "group_mgmt_cipher_suite"
-                    ] = self._get_cipher_list(data)
+                    rsn_values["group_mgmt_cipher_suite"] = (
+                        self._get_cipher_list(data)
+                    )
                     data = data[4:]
 
                 return rsn_values
@@ -1064,9 +1065,9 @@
                         )
 
                     if msg_type == NL80211_BSS_ELEMENTS_VHT_OPERATION:
-                        self.value[
-                            "VHT_OPERATION"
-                        ] = self.binary_vht_operation(offset + 2, length)
+                        self.value["VHT_OPERATION"] = (
+                            self.binary_vht_operation(offset + 2, length)
+                        )
 
                     offset += length + 2
 
@@ -1216,44 +1217,95 @@
                 self.value["TDLS_PEER"] = False
                 self.value["ASSOCIATED"] = False
 
-                init = offset = self.offset + 4
-                while (offset - init) < (self.length - 4):
-                    (msg_type, length) = struct.unpack_from(
-                        'BB', self.data, offset
-                    )
-                    mask, set_ = struct.unpack_from(
-                        'II', self.data, offset + 2
-                    )
+                offset = self.offset + 4
+                mask, set_ = struct.unpack_from('II', self.data, offset)
 
-                    if mask & NL80211_STA_FLAG_AUTHORIZED:
-                        if set_ & NL80211_STA_FLAG_AUTHORIZED:
-                            self.value["AUTHORIZED"] = True
-
-                    if mask & NL80211_STA_FLAG_SHORT_PREAMBLE:
-                        if set_ & NL80211_STA_FLAG_SHORT_PREAMBLE:
-                            self.value["SHORT_PREAMBLE"] = True
-
-                    if mask & NL80211_STA_FLAG_WME:
-                        if set_ & NL80211_STA_FLAG_WME:
-                            self.value["WME"] = True
-
-                    if mask & NL80211_STA_FLAG_MFP:
-                        if set_ & NL80211_STA_FLAG_MFP:
-                            self.value["MFP"] = True
-
-                    if mask & NL80211_STA_FLAG_AUTHENTICATED:
-                        if set_ & NL80211_STA_FLAG_AUTHENTICATED:
-                            self.value["AUTHENTICATED"] = True
-
-                    if mask & NL80211_STA_FLAG_TDLS_PEER:
-                        if set_ & NL80211_STA_FLAG_TDLS_PEER:
-                            self.value["TDLS_PEER"] = True
-
-                    if mask & NL80211_STA_FLAG_ASSOCIATED:
-                        if set_ & NL80211_STA_FLAG_ASSOCIATED:
-                            self.value["ASSOCIATED"] = True
+                if mask & NL80211_STA_FLAG_AUTHORIZED:
+                    if set_ & NL80211_STA_FLAG_AUTHORIZED:
+                        self.value["AUTHORIZED"] = True
 
-                    offset += length + 2
+                if mask & NL80211_STA_FLAG_SHORT_PREAMBLE:
+                    if set_ & NL80211_STA_FLAG_SHORT_PREAMBLE:
+                        self.value["SHORT_PREAMBLE"] = True
+
+                if mask & NL80211_STA_FLAG_WME:
+                    if set_ & NL80211_STA_FLAG_WME:
+                        self.value["WME"] = True
+
+                if mask & NL80211_STA_FLAG_MFP:
+                    if set_ & NL80211_STA_FLAG_MFP:
+                        self.value["MFP"] = True
+
+                if mask & NL80211_STA_FLAG_AUTHENTICATED:
+                    if set_ & NL80211_STA_FLAG_AUTHENTICATED:
+                        self.value["AUTHENTICATED"] = True
+
+                if mask & NL80211_STA_FLAG_TDLS_PEER:
+                    if set_ & NL80211_STA_FLAG_TDLS_PEER:
+                        self.value["TDLS_PEER"] = True
+
+                if mask & NL80211_STA_FLAG_ASSOCIATED:
+                    if set_ & NL80211_STA_FLAG_ASSOCIATED:
+                        self.value["ASSOCIATED"] = True
+
+        class rate_info(nla):
+            '''
+            Decode the data rate information
+            See nl80211.h: enum nl80211_sta_info,
+            NL80211_STA_INFO_TX_BITRATE
+            NL80211_STA_INFO_RX_BITRATE
+            '''
+
+            prefix = "NL80211_RATE_INFO_"
+            nla_map = (
+                ('__NL80211_RATE_INFO_INVALID', 'hex'),
+                ('NL80211_RATE_INFO_BITRATE', 'uint16'),
+                ('NL80211_RATE_INFO_MCS', 'uint8'),
+                ('NL80211_RATE_INFO_40_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_SHORT_GI', 'flag'),
+                ('NL80211_RATE_INFO_BITRATE32', 'uint32'),
+                ('NL80211_RATE_INFO_VHT_MCS', 'uint8'),
+                ('NL80211_RATE_INFO_VHT_NSS', 'uint8'),
+                ('NL80211_RATE_INFO_80_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_80P80_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_160_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_10_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_5_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_HE_MCS', 'uint8'),
+                ('NL80211_RATE_INFO_HE_NSS', 'uint8'),
+                ('NL80211_RATE_INFO_HE_GI', 'uint8'),
+                ('NL80211_RATE_INFO_HE_DCM', 'uint8'),
+                ('NL80211_RATE_INFO_HE_RU_ALLOC', 'uint8'),
+                ('NL80211_RATE_INFO_320_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_EHT_MCS', 'uint8'),
+                ('NL80211_RATE_INFO_EHT_NSS', 'uint8'),
+                ('NL80211_RATE_INFO_EHT_GI', 'uint8'),
+                ('NL80211_RATE_INFO_EHT_RU_ALLOC', 'uint8'),
+                ('NL80211_RATE_INFO_S1G_MCS', 'uint8'),
+                ('NL80211_RATE_INFO_S1G_NSS', 'uint8'),
+                ('NL80211_RATE_INFO_1_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_2_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_4_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_8_MHZ_WIDTH', 'flag'),
+                ('NL80211_RATE_INFO_16_MHZ_WIDTH', 'flag'),
+            )
+
+        class bss_param(nla):
+            '''
+            Decode the BSS information
+            See nl80211.h: enum nl80211_sta_bss_param,
+            NL80211_STA_INFO_BSS_PARAM
+            '''
+
+            prefix = "NL80211_STA_BSS_PARAM_"
+            nla_map = (
+                ('__NL80211_STA_BSS_PARAM_INVALID', 'hex'),
+                ('NL80211_STA_BSS_PARAM_CTS_PROT', 'flag'),
+                ('NL80211_STA_BSS_PARAM_SHORT_PREAMBLE', 'flag'),
+                ('NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME', 'flag'),
+                ('NL80211_STA_BSS_PARAM_DTIM_PERIOD', 'uint8'),
+                ('NL80211_STA_BSS_PARAM_BEACON_INTERVAL', 'uint16'),
+            )
 
         prefix = 'NL80211_STA_INFO_'
         nla_map = (
@@ -1265,14 +1317,14 @@
             ('NL80211_STA_INFO_PLID', 'uint16'),
             ('NL80211_STA_INFO_PLINK_STATE', 'uint8'),
             ('NL80211_STA_INFO_SIGNAL', 'int8'),
-            ('NL80211_STA_INFO_TX_BITRATE', 'hex'),
+            ('NL80211_STA_INFO_TX_BITRATE', 'rate_info'),
             ('NL80211_STA_INFO_RX_PACKETS', 'uint32'),
             ('NL80211_STA_INFO_TX_PACKETS', 'uint32'),
             ('NL80211_STA_INFO_TX_RETRIES', 'uint32'),
             ('NL80211_STA_INFO_TX_FAILED', 'uint32'),
             ('NL80211_STA_INFO_SIGNAL_AVG', 'int8'),
-            ('NL80211_STA_INFO_RX_BITRATE', 'hex'),
-            ('NL80211_STA_INFO_BSS_PARAM', 'hex'),
+            ('NL80211_STA_INFO_RX_BITRATE', 'rate_info'),
+            ('NL80211_STA_INFO_BSS_PARAM', 'bss_param'),
             ('NL80211_STA_INFO_CONNECTED_TIME', 'uint32'),
             ('NL80211_STA_INFO_STA_FLAGS', 'STAFlags'),
             ('NL80211_STA_INFO_BEACON_LOSS', 'uint32'),
@@ -1282,12 +1334,12 @@
             ('NL80211_STA_INFO_NONPEER_PM', 'hex'),
             ('NL80211_STA_INFO_RX_BYTES64', 'uint64'),
             ('NL80211_STA_INFO_TX_BYTES64', 'uint64'),
-            ('NL80211_STA_INFO_CHAIN_SIGNAL', 'string'),
-            ('NL80211_STA_INFO_CHAIN_SIGNAL_AVG', 'string'),
+            ('NL80211_STA_INFO_CHAIN_SIGNAL', '*int8'),
+            ('NL80211_STA_INFO_CHAIN_SIGNAL_AVG', '*int8'),
             ('NL80211_STA_INFO_EXPECTED_THROUGHPUT', 'uint32'),
             ('NL80211_STA_INFO_RX_DROP_MISC', 'uint32'),
             ('NL80211_STA_INFO_BEACON_RX', 'uint64'),
-            ('NL80211_STA_INFO_BEACON_SIGNAL_AVG', 'uint8'),
+            ('NL80211_STA_INFO_BEACON_SIGNAL_AVG', 'int8'),
             ('NL80211_STA_INFO_TID_STATS', 'hex'),
             ('NL80211_STA_INFO_RX_DURATION', 'uint64'),
             ('NL80211_STA_INFO_PAD', 'hex'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/proxy.py 
new/pyroute2-0.7.12/pyroute2/netlink/proxy.py
--- old/pyroute2-0.7.10/pyroute2/netlink/proxy.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/proxy.py       2024-02-07 
10:51:28.000000000 +0100
@@ -1,6 +1,7 @@
 '''
 Netlink proxy engine
 '''
+
 import errno
 import logging
 import struct
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netlink/rtnl/__init__.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/__init__.py       2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/__init__.py       2024-02-07 
10:51:28.000000000 +0100
@@ -34,6 +34,7 @@
 Module contents:
 
 '''
+
 from pyroute2.common import map_namespace
 
 #  RTnetlink multicast group flags (for use with bind())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/ifinfmsg/__init__.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/ifinfmsg/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/ifinfmsg/__init__.py      
2023-08-02 18:44:38.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/ifinfmsg/__init__.py      
2024-02-09 23:09:58.000000000 +0100
@@ -450,6 +450,7 @@
     #
     sql_constraints = {'index': 'NOT NULL'}
     sql_extra_fields = (('state', 'TEXT'),)
+    lookup_fallbacks = {'index': 'ifname'}
 
     fields = (
         ('family', 'B'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py      
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/act_skbedit.py      
2024-02-07 10:51:28.000000000 +0100
@@ -42,7 +42,6 @@
     - queue: integer
 '''
 
-
 from pyroute2.netlink import nla
 from pyroute2.netlink.rtnl.tcmsg.common import tc_actions
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/cls_u32.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/cls_u32.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/cls_u32.py  2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/cls_u32.py  2024-02-07 
10:51:28.000000000 +0100
@@ -54,6 +54,7 @@
         # 0xffffff00 = 255.255.255.0 (/24)
         # 16 = Destination network field bit offset
 '''
+
 import struct
 from socket import htons
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/common.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/common.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/common.py   2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/common.py   2024-02-07 
10:51:28.000000000 +0100
@@ -263,7 +263,7 @@
             attrs.append(['TCA_FLOW_RSHIFT', rshift_value])
         elif op == 'addend':
             # Check if an IP was specified
-            if type(num) == str and len(num.split('.')) == 4:
+            if isinstance(num, str) and len(num.split('.')) == 4:
                 if num.startswith('-'):
                     inverse = True
                 else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_cake.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_cake.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_cake.py       
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_cake.py       
2024-02-07 10:51:28.000000000 +0100
@@ -72,7 +72,6 @@
     - wash: False or True (False by default)
 '''
 
-
 from pyroute2.netlink import nla
 from pyroute2.netlink.rtnl import TC_H_ROOT
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_choke.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_choke.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_choke.py      
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_choke.py      
2024-02-07 10:51:28.000000000 +0100
@@ -21,6 +21,7 @@
           ecn=True)
 
 '''
+
 import logging
 import struct
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py     
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_clsact.py     
2024-02-07 10:51:28.000000000 +0100
@@ -23,6 +23,7 @@
           parent="ffff:fff3", classid=1, direct_action=True)
 
 '''
+
 from pyroute2.netlink.rtnl import TC_H_CLSACT
 
 parent = TC_H_CLSACT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_drr.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_drr.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_drr.py        
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_drr.py        
2024-02-07 10:51:28.000000000 +0100
@@ -10,6 +10,7 @@
     ip.tc('add-class', 'drr', interface, '1:20', quantum=1600)
 
 '''
+
 from pyroute2.netlink import nla
 from pyroute2.netlink.rtnl import TC_H_ROOT
 from pyroute2.netlink.rtnl.tcmsg.common import stats2 as c_stats2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py       
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_hfsc.py       
2024-02-07 10:51:28.000000000 +0100
@@ -19,6 +19,7 @@
 * `fsc`: link-share curve
 * `usc`: upper-limit curve
 '''
+
 from pyroute2.netlink import nla
 from pyroute2.netlink.rtnl import RTM_DELQDISC, RTM_NEWQDISC, TC_H_ROOT
 from pyroute2.netlink.rtnl.tcmsg.common import get_rate, get_time
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_htb.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_htb.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_htb.py        
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_htb.py        
2024-02-07 10:51:28.000000000 +0100
@@ -59,6 +59,7 @@
           target=0x10020,
           keys=["0x5/0xf+0", "0x10/0xff+33"])
 '''
+
 from pyroute2.netlink import nla
 from pyroute2.netlink.rtnl import RTM_DELQDISC, RTM_NEWQDISC, TC_H_ROOT
 from pyroute2.netlink.rtnl.tcmsg.common import (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_template.py 
new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_template.py
--- old/pyroute2-0.7.10/pyroute2/netlink/rtnl/tcmsg/sched_template.py   
2023-03-15 11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/netlink/rtnl/tcmsg/sched_template.py   
2024-02-07 10:51:28.000000000 +0100
@@ -5,6 +5,7 @@
 All the methods, variables and classes are optional,
 but the naming scheme is fixed.
 '''
+
 from pyroute2.netlink import nla
 from pyroute2.netlink.rtnl import TC_H_ROOT
 from pyroute2.netlink.rtnl.tcmsg import common
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/netns/__init__.py 
new/pyroute2-0.7.12/pyroute2/netns/__init__.py
--- old/pyroute2-0.7.10/pyroute2/netns/__init__.py      2023-10-27 
20:33:18.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/netns/__init__.py      2024-02-07 
10:51:28.000000000 +0100
@@ -79,6 +79,7 @@
 SELinux state with `getenforce` command.
 
 '''
+
 import ctypes
 import ctypes.util
 import errno
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/nftables/main.py 
new/pyroute2-0.7.12/pyroute2/nftables/main.py
--- old/pyroute2-0.7.10/pyroute2/nftables/main.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/nftables/main.py       2024-02-07 
10:51:28.000000000 +0100
@@ -1,5 +1,6 @@
 '''
 '''
+
 from pyroute2.netlink.nfnetlink import nfgen_msg
 from pyroute2.netlink.nfnetlink.nftsocket import (
     DATA_TYPE_ID_TO_NAME,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/remote/iproute.py 
new/pyroute2-0.7.12/pyroute2/remote/iproute.py
--- old/pyroute2-0.7.10/pyroute2/remote/iproute.py      2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/remote/iproute.py      2024-02-09 
15:07:02.000000000 +0100
@@ -130,6 +130,7 @@
             raise
         self.marshal = MarshalRtnl()
         self.target = target
+        self.groups = 67372509
 
     def clone(self):
         return type(self)(*self._argv, **self._kwarg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/remote/transport.py 
new/pyroute2-0.7.12/pyroute2/remote/transport.py
--- old/pyroute2-0.7.10/pyroute2/remote/transport.py    2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/remote/transport.py    2024-02-07 
10:51:28.000000000 +0100
@@ -196,9 +196,9 @@
                             and ipr._brd_socket is not None
                         ):
                             inputs.append(ipr._brd_socket.fileno())
-                            broadcasts[
-                                ipr._brd_socket.fileno()
-                            ] = ipr._brd_socket
+                            broadcasts[ipr._brd_socket.fileno()] = (
+                                ipr._brd_socket
+                            )
                     except Exception as e:
                         ret = None
                         error = e
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/requests/main.py 
new/pyroute2-0.7.12/pyroute2/requests/main.py
--- old/pyroute2-0.7.10/pyroute2/requests/main.py       2023-07-03 
16:56:33.000000000 +0200
+++ new/pyroute2-0.7.12/pyroute2/requests/main.py       2024-02-07 
10:51:28.000000000 +0100
@@ -1,6 +1,7 @@
 '''
 General request and RTNL object data filters.
 '''
+
 import weakref
 from collections import ChainMap
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2/requests/neighbour.py 
new/pyroute2-0.7.12/pyroute2/requests/neighbour.py
--- old/pyroute2-0.7.10/pyroute2/requests/neighbour.py  2023-03-15 
11:10:02.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2/requests/neighbour.py  2024-01-29 
12:26:05.000000000 +0100
@@ -28,6 +28,12 @@
     def set_state(self, context, value):
         return self._state(value)
 
+    def set_dst(self, context, value):
+        if value:
+            return {'dst': value}
+        else:
+            return {}
+
 
 class NeighbourIPRouteFilter(IPRouteFilter):
     def set_dst(self, context, value):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/pyroute2.egg-info/PKG-INFO 
new/pyroute2-0.7.12/pyroute2.egg-info/PKG-INFO
--- old/pyroute2-0.7.10/pyroute2.egg-info/PKG-INFO      2023-11-30 
09:16:18.000000000 +0100
+++ new/pyroute2-0.7.12/pyroute2.egg-info/PKG-INFO      2024-02-10 
16:04:20.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: pyroute2
-Version: 0.7.10
+Version: 0.7.12
 Summary: Python Netlink library
 Home-page: https://github.com/svinota/pyroute2
 Author: Peter Saveliev
@@ -17,12 +17,11 @@
 Classifier: Intended Audience :: System Administrators
 Classifier: Intended Audience :: Telecommunications Industry
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
 Classifier: Development Status :: 4 - Beta
 Description-Content-Type: text/x-rst
 License-File: LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyroute2-0.7.10/setup.cfg 
new/pyroute2-0.7.12/setup.cfg
--- old/pyroute2-0.7.10/setup.cfg       2023-11-30 09:16:18.271647000 +0100
+++ new/pyroute2-0.7.12/setup.cfg       2024-02-10 16:04:20.603168700 +0100
@@ -20,12 +20,11 @@
        Intended Audience :: System Administrators
        Intended Audience :: Telecommunications Industry
        Programming Language :: Python :: 3
-       Programming Language :: Python :: 3.6
-       Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
        Programming Language :: Python :: 3.9
        Programming Language :: Python :: 3.10
        Programming Language :: Python :: 3.11
+       Programming Language :: Python :: 3.12
        Development Status :: 4 - Beta
 
 [options]

Reply via email to