diff options
| author | Christian Breunig <christian@breunig.cc> | 2026-05-15 16:24:47 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-15 17:24:47 +0300 |
| commit | 08542c03c0d1ab2c114966f6fbd4c2b7c3a45b4a (patch) | |
| tree | 77d96090c7140c1916224179a6b8f848dfe8d4fe /src | |
| parent | a4cf50f68bdcfd14cfcb51b2ff3f4058c1a0f5c6 (diff) | |
| download | vyos-1x-08542c03c0d1ab2c114966f6fbd4c2b7c3a45b4a.tar.gz vyos-1x-08542c03c0d1ab2c114966f6fbd4c2b7c3a45b4a.zip | |
vyos-netlinkd: T8781: do not call commit_in_progress() for EVERY netlink message (#5199)
* vyos-netlinkd: T8781: do not call commit_in_progress() for EVERY netlink message
Signed-off-by: Fabrizzio Petrucci <fabrizziopm@compumundohipermegared.one>
* vyos-netlinkd: T8781: restrict netlink subscription to link multicast group
Bind IPRoute with RTMGRP_LINK only so route/rule/neighbour/address updates
(e.g. full-table BGP) are not delivered to this socket.
Add a match wildcard so unexpected message types do not raise MatchError and
get logged as generic errors.
---------
Signed-off-by: Fabrizzio Petrucci <fabrizziopm@compumundohipermegared.one>
Co-authored-by: Fabrizzio Petrucci <fabrizziopm@compumundohipermegared.one>
Diffstat (limited to 'src')
| -rwxr-xr-x | src/services/vyos-netlinkd | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/services/vyos-netlinkd b/src/services/vyos-netlinkd index 7bf6b8cce..368824bf9 100755 --- a/src/services/vyos-netlinkd +++ b/src/services/vyos-netlinkd @@ -22,6 +22,7 @@ import select from pyroute2 import IPRoute # pylint: disable = no-name-in-module from pyroute2 import NetlinkError # pylint: disable = no-name-in-module +from pyroute2.netlink.rtnl import RTMGRP_LINK from time import sleep from typing import Optional @@ -105,7 +106,8 @@ def main(): facility=syslog.LOG_DAEMON) syslog.syslog(syslog.LOG_INFO, "VyOS Netlink listener daemon started.") - ipr = IPRoute() + # Subscribe to link notifications only (not routes/rules/neigh/addr/...). + ipr = IPRoute(groups=RTMGRP_LINK) ipr.bind() fd = ipr.fileno() @@ -123,12 +125,17 @@ def main(): # timeout - retry continue + # Check if a config commit is in progress before processing any + # messages. This avoids blocking per-message and reduces unnecessary + # commit_in_progress() calls. + if commit_in_progress(): + syslog.syslog(syslog.LOG_DEBUG, + 'Config commit in progress, skipping netlink events') + sleep(1) + continue + # Receive and process any messages for message in ipr.get(): - # Wait for commit to complete - while commit_in_progress(): - sleep(0.250) - # Parse NETLINK message match message['event']: # Message received during interface creation or modification @@ -153,6 +160,8 @@ def main(): # Deletion of a network link which has been previously added to the kernel case 'RTM_DELLINK': pass + case _: + pass except NetlinkError as e: syslog.syslog(syslog.LOG_ERR, f'Netlink error: {e}') |
