diff options
| -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}') |
