From b4e6688dfe5549358ba7d853dcdaaad1fcebff64 Mon Sep 17 00:00:00 2001 From: Roshan Warrier Date: Mon, 30 Mar 2026 16:09:43 +0530 Subject: [PATCH] Localip: uses assigned netlink port id on Linux (#2253) Fixes #2252 --- src/common/impl/netif_linux.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/common/impl/netif_linux.c b/src/common/impl/netif_linux.c index eafacdcb0..f24218ecf 100644 --- a/src/common/impl/netif_linux.c +++ b/src/common/impl/netif_linux.c @@ -7,6 +7,18 @@ #include #include +static uint32_t ffNetifGetNetlinkPortId(int sock_fd) { + struct sockaddr_nl addr = {}; + socklen_t addrLen = sizeof(addr); + if (getsockname(sock_fd, (struct sockaddr*) &addr, &addrLen) < 0) { + FF_DEBUG("Failed to query netlink socket address (use PID instead): %s", strerror(errno)); + return instance.state.platform.pid; + } else { + FF_DEBUG("Netlink port ID: %u", addr.nl_pid); + return addr.nl_pid; + } +} + bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { FF_DEBUG("Starting IPv4 default route detection"); @@ -17,9 +29,6 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { } FF_DEBUG("Created netlink socket: fd=%d", sock_fd); - uint32_t pid = instance.state.platform.pid; - FF_DEBUG("Process PID: %u", pid); - // Bind socket struct sockaddr_nl addr = { .nl_family = AF_NETLINK, @@ -33,6 +42,8 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { } FF_DEBUG("Successfully bound socket"); + uint32_t pid = ffNetifGetNetlinkPortId(sock_fd); + struct __attribute__((__packed__)) { struct nlmsghdr nlh; struct rtmsg rtm; @@ -228,9 +239,6 @@ bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) { } FF_DEBUG("Created netlink socket: fd=%d", sock_fd); - uint32_t pid = instance.state.platform.pid; - FF_DEBUG("Process PID: %u", pid); - // Bind socket struct sockaddr_nl addr = { .nl_family = AF_NETLINK, @@ -244,6 +252,8 @@ bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) { } FF_DEBUG("Successfully bound socket"); + uint32_t pid = ffNetifGetNetlinkPortId(sock_fd); + struct __attribute__((__packed__)) { struct nlmsghdr nlh; struct rtmsg rtm;