summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/vyos/ethtool.py27
-rw-r--r--python/vyos/ifconfig/interface.py8
-rw-r--r--python/vyos/template.py20
3 files changed, 49 insertions, 6 deletions
diff --git a/python/vyos/ethtool.py b/python/vyos/ethtool.py
index e8a339d2f..136feae8d 100644
--- a/python/vyos/ethtool.py
+++ b/python/vyos/ethtool.py
@@ -13,7 +13,7 @@
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
-from vyos.util import cmd
+from vyos.util import popen
class Ethtool:
"""
@@ -33,12 +33,13 @@ class Ethtool:
# 'tx-esp-segmentation': {'fixed': True, 'on': False},
# }
features = { }
+ ring_buffers = { }
def __init__(self, ifname):
# Now populate features dictionaty
- tmp = cmd(f'ethtool -k {ifname}')
+ out, err = popen(f'ethtool -k {ifname}')
# skip the first line, it only says: "Features for eth0":
- for line in tmp.splitlines()[1:]:
+ for line in out.splitlines()[1:]:
if ":" in line:
key, value = [s.strip() for s in line.strip().split(":", 1)]
fixed = "fixed" in value
@@ -49,6 +50,16 @@ class Ethtool:
"fixed": fixed
}
+ out, err = popen(f'ethtool -g {ifname}')
+ # We are only interested in line 2-5 which contains the device maximum
+ # ringbuffers
+ for line in out.splitlines()[2:6]:
+ if ':' in line:
+ key, value = [s.strip() for s in line.strip().split(":", 1)]
+ key = key.lower().replace(' ', '_')
+ self.ring_buffers[key] = int(value)
+
+
def is_fixed_lro(self):
# in case of a missing configuration, rather return "fixed". In Ethtool
# terminology "fixed" means the setting can not be changed by the user.
@@ -78,3 +89,13 @@ class Ethtool:
# in case of a missing configuration, rather return "fixed". In Ethtool
# terminology "fixed" means the setting can not be changed by the user.
return self.features.get('udp-fragmentation-offload', True).get('fixed', True)
+
+ def get_rx_buffer(self):
+ # Configuration of RX ring-buffers is not supported on every device,
+ # thus when it's impossible return None
+ return self.ring_buffers.get('rx', None)
+
+ def get_tx_buffer(self):
+ # Configuration of TX ring-buffers is not supported on every device,
+ # thus when it's impossible return None
+ return self.ring_buffers.get('tx', None)
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index d9507d816..4bdabd432 100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
@@ -923,12 +923,12 @@ class Interface(Control):
else:
add_vlan.append(vlan)
allowed_vlan_ids.append(vlan)
-
+
# Remove redundant VLANs from the system
for vlan in list_diff(cur_vlan_ids, add_vlan):
cmd = f'bridge vlan del dev {ifname} vid {vlan} master'
self._cmd(cmd)
-
+
for vlan in allowed_vlan_ids:
cmd = f'bridge vlan add dev {ifname} vid {vlan} master'
self._cmd(cmd)
@@ -1074,6 +1074,10 @@ class Interface(Control):
interface setup code and provide a single point of entry when workin
on any interface. """
+ if self.debug:
+ import pprint
+ pprint.pprint(config)
+
# Cache the configuration - it will be reused inside e.g. DHCP handler
# XXX: maybe pass the option via __init__ in the future and rename this
# method to apply()?
diff --git a/python/vyos/template.py b/python/vyos/template.py
index 527384d0b..22883b103 100644
--- a/python/vyos/template.py
+++ b/python/vyos/template.py
@@ -288,7 +288,6 @@ def compare_netmask(netmask1, netmask2):
except:
return False
-
@register_filter('isc_static_route')
def isc_static_route(subnet, router):
# https://ercpe.de/blog/pushing-static-routes-with-isc-dhcp-server
@@ -316,3 +315,22 @@ def is_file(filename):
if os.path.exists(filename):
return os.path.isfile(filename)
return False
+
+@register_filter('get_dhcp_router')
+def get_dhcp_router(interface):
+ """ Static routes can point to a router received by a DHCP reply. This
+ helper is used to get the current default router from the DHCP reply.
+
+ Returns False of no router is found, returns the IP address as string if
+ a router is found.
+ """
+ interface = interface.replace('.', '_')
+ lease_file = f'/var/lib/dhcp/dhclient_{interface}.leases'
+ if not os.path.exists(lease_file):
+ return None
+
+ from vyos.util import read_file
+ for line in read_file(lease_file).splitlines():
+ if 'option routers' in line:
+ (_, _, address) = line.split()
+ return address.rstrip(';')