diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ifconfig/interface.py | 39 | ||||
| -rw-r--r-- | python/vyos/ifconfig/wireguard.py | 4 | 
2 files changed, 40 insertions, 3 deletions
| diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py index cc6149428..ddac387e7 100644 --- a/python/vyos/ifconfig/interface.py +++ b/python/vyos/ifconfig/interface.py @@ -1,4 +1,4 @@ -# Copyright 2019-2022 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2019-2023 VyOS maintainers and contributors <maintainers@vyos.io>  #  # This library is free software; you can redistribute it and/or  # modify it under the terms of the GNU Lesser General Public @@ -224,6 +224,10 @@ class Interface(Control):              'validate': lambda link: assert_range(link,0,3),              'location': '/proc/sys/net/ipv4/conf/{ifname}/link_filter',          }, +        'per_client_thread': { +            'validate': assert_boolean, +            'location': '/sys/class/net/{ifname}/threaded', +        },      }      _sysfs_get = { @@ -275,6 +279,10 @@ class Interface(Control):          'link_detect': {              'location': '/proc/sys/net/ipv4/conf/{ifname}/link_filter',          }, +        'per_client_thread': { +            'validate': assert_boolean, +            'location': '/sys/class/net/{ifname}/threaded', +        },      }      @classmethod @@ -1386,6 +1394,30 @@ class Interface(Control):                                   f'egress redirect dev {target_if}')              if err: print('tc filter add for redirect failed') +    def set_per_client_thread(self, enable): +        """ +        Per-device control to enable/disable the threaded mode for all the napi +        instances of the given network device, without the need for a device up/down. + +        User sets it to 1 or 0 to enable or disable threaded mode. + +        Example: +        >>> from vyos.ifconfig import Interface +        >>> Interface('wg1').set_per_client_thread(1) +        """ +        # In the case of a "virtual" interface like wireguard, the sysfs +        # node is only created once there is a peer configured. We can now +        # add a verify() code-path for this or make this dynamic without +        # nagging the user +        tmp = self._sysfs_get['per_client_thread']['location'] +        if not os.path.exists(tmp): +            return None + +        tmp = self.get_interface('per_client_thread') +        if tmp == enable: +            return None +        self.set_interface('per_client_thread', enable) +      def update(self, config):          """ General helper function which works on a dictionary retrived by          get_config_dict(). It's main intention is to consolidate the scattered @@ -1601,6 +1633,11 @@ class Interface(Control):          # configure interface mirror or redirection target          self.set_mirror_redirect() +        # enable/disable NAPI threading mode +        tmp = dict_search('per_client_thread', config) +        value = '1' if (tmp != None) else '0' +        self.set_per_client_thread(value) +          # Enable/Disable of an interface must always be done at the end of the          # derived class to make use of the ref-counting set_admin_state()          # function. We will only enable the interface if 'up' was called as diff --git a/python/vyos/ifconfig/wireguard.py b/python/vyos/ifconfig/wireguard.py index fe5e9c519..4aac103ec 100644 --- a/python/vyos/ifconfig/wireguard.py +++ b/python/vyos/ifconfig/wireguard.py @@ -1,4 +1,4 @@ -# Copyright 2019-2022 VyOS maintainers and contributors <maintainers@vyos.io> +# Copyright 2019-2023 VyOS maintainers and contributors <maintainers@vyos.io>  #  # This library is free software; you can redistribute it and/or  # modify it under the terms of the GNU Lesser General Public @@ -25,6 +25,7 @@ from hurry.filesize import alternative  from vyos.ifconfig import Interface  from vyos.ifconfig import Operational  from vyos.template import is_ipv6 +from vyos.base import Warning  class WireGuardOperational(Operational):      def _dump(self): @@ -184,7 +185,6 @@ class WireGuardIf(Interface):          base_cmd += f' private-key {tmp_file.name}'          base_cmd = base_cmd.format(**config) -          if 'peer' in config:              for peer, peer_config in config['peer'].items():                  # T4702: No need to configure this peer when it was explicitly | 
