summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2026-05-15 16:24:47 +0200
committerGitHub <noreply@github.com>2026-05-15 17:24:47 +0300
commit08542c03c0d1ab2c114966f6fbd4c2b7c3a45b4a (patch)
tree77d96090c7140c1916224179a6b8f848dfe8d4fe /src
parenta4cf50f68bdcfd14cfcb51b2ff3f4058c1a0f5c6 (diff)
downloadvyos-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-xsrc/services/vyos-netlinkd19
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}')