diff options
author | Christian Poessinger <christian@poessinger.com> | 2022-09-12 08:06:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-12 08:06:38 +0200 |
commit | 84ee78e524713d98a01212ae0b7c58fcbc36382b (patch) | |
tree | 2d5a18bded2ef2f3d13bb15a069827756cc640d9 | |
parent | 1a2a1591cc7382bd0b484ea4e564e704a14f42d4 (diff) | |
parent | 53355271a2864d844daca89a064c21e514e10adb (diff) | |
download | vyos-1x-84ee78e524713d98a01212ae0b7c58fcbc36382b.tar.gz vyos-1x-84ee78e524713d98a01212ae0b7c58fcbc36382b.zip |
Merge pull request #1533 from jack9603301/T4689
rfs: T4689: Support RFS(Receive Flow Steering)
-rw-r--r-- | interface-definitions/interfaces-ethernet.xml.in | 6 | ||||
-rw-r--r-- | python/vyos/ifconfig/ethernet.py | 19 | ||||
-rwxr-xr-x | smoketest/scripts/cli/test_interfaces_ethernet.py | 19 |
3 files changed, 44 insertions, 0 deletions
diff --git a/interface-definitions/interfaces-ethernet.xml.in b/interface-definitions/interfaces-ethernet.xml.in index c821f04b2..a85296209 100644 --- a/interface-definitions/interfaces-ethernet.xml.in +++ b/interface-definitions/interfaces-ethernet.xml.in @@ -94,6 +94,12 @@ <valueless/> </properties> </leafNode> + <leafNode name="rfs"> + <properties> + <help>Enable Receive Flow Steering</help> + <valueless/> + </properties> + </leafNode> <leafNode name="sg"> <properties> <help>Enable Scatter-Gather</help> diff --git a/python/vyos/ifconfig/ethernet.py b/python/vyos/ifconfig/ethernet.py index b8deb3311..55e7ffc1e 100644 --- a/python/vyos/ifconfig/ethernet.py +++ b/python/vyos/ifconfig/ethernet.py @@ -16,6 +16,7 @@ import os import re +from glob import glob from vyos.ethtool import Ethtool from vyos.ifconfig.interface import Interface from vyos.util import run @@ -258,6 +259,21 @@ class EthernetIf(Interface): # send bitmask representation as hex string without leading '0x' return self.set_interface('rps', rps_cpus) + def set_rfs(self, state): + rfs_flow = 0 + global_rfs_flow = 0 + queues = glob(f'/sys/class/net/{ifname}/queues/rx-*') + if state: + global_rfs_flow = 32768 + rfs_flow = global_rfs_flow/queues + + call(f'echo {global_rfs_flow} > /proc/sys/net/core/rps_sock_flow_entries') + + for i in range(0,queues): + call(f'echo {rfs_flow} > /sys/class/net/{ifname}/queues/rx-{i}/rps_flow_cnt') + + return True + def set_sg(self, state): """ Enable Scatter-Gather support. State can be either True or False. @@ -342,6 +358,9 @@ class EthernetIf(Interface): # RPS - Receive Packet Steering self.set_rps(dict_search('offload.rps', config) != None) + # RFS - Receive Flow Steering + self.set_rfs(dict_search('offload.rfs', config) != None) + # scatter-gather option self.set_sg(dict_search('offload.sg', config) != None) diff --git a/smoketest/scripts/cli/test_interfaces_ethernet.py b/smoketest/scripts/cli/test_interfaces_ethernet.py index 05d2ae5f5..fa6ba46a5 100755 --- a/smoketest/scripts/cli/test_interfaces_ethernet.py +++ b/smoketest/scripts/cli/test_interfaces_ethernet.py @@ -18,6 +18,7 @@ import os import re import unittest +from glob import glob from netifaces import AF_INET from netifaces import AF_INET6 from netifaces import ifaddresses @@ -185,6 +186,24 @@ class EthernetInterfaceTest(BasicInterfaceTest.TestCase): self.assertEqual(f'{cpus:x}', f'{rps_cpus:x}') + def test_offloading_rfs(self): + global_rfs_flow = 32768 + rfs_flow = global_rfs_flow + + for interface in self._interfaces: + self.cli_set(self._base_path + [interface, 'offload', 'rfs']) + self.cli_commit() + + for interface in self._interfaces: + queues = glob(f'/sys/class/net/{interface}/queues/rx-*') + rfs_flow = global_rfs_flow/queues + for i in range(0,queues): + flows = read_file(f'/sys/class/net/{interface}/queues/rx-{i}/rps_cpus') + self.assertEqual(int(flows), rfs_flow) + + global_flows = read_file(f'/proc/sys/net/core/rps_sock_flow_entries') + self.assertEqual(int(global_flows), global_rfs_flow) + def test_non_existing_interface(self): unknonw_interface = self._base_path + ['eth667'] self.cli_set(unknonw_interface) |