summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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}')