From d0ca944b9c25c8e1afbc9071633457bcef1dbf67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 1 Apr 2025 10:48:30 +0800 Subject: [PATCH] Netif (Linux): support default route detection for ipv6 --- src/common/netif/netif_linux.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/common/netif/netif_linux.c b/src/common/netif/netif_linux.c index 1845ee0e2..6c0dbd1e6 100644 --- a/src/common/netif/netif_linux.c +++ b/src/common/netif/netif_linux.c @@ -7,7 +7,7 @@ #define FF_STR_INDIR(x) #x #define FF_STR(x) FF_STR_INDIR(x) -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +static bool getDefaultRouteIPv4(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) { FILE* FF_AUTO_CLOSE_FILE netRoute = fopen("/proc/net/route", "r"); if (!netRoute) return false; @@ -15,12 +15,38 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) // skip first line FF_UNUSED(fscanf(netRoute, "%*[^\n]\n")); - unsigned long long destination; //, gateway, flags, refCount, use, metric, mask, mtu, + unsigned long long destination; //, gateway, flags, refCount, use, metric, mask, mtu, ... while (fscanf(netRoute, "%" FF_STR(IF_NAMESIZE) "s%llx%*[^\n]", iface, &destination) == 2) { if (destination != 0) continue; *ifIndex = if_nametoindex(iface); return true; } + iface[0] = '\0'; return false; } + +static bool getDefaultRouteIPv6(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +{ + FILE* FF_AUTO_CLOSE_FILE netRoute = fopen("/proc/net/ipv6_route", "r"); + if (!netRoute) return false; + + uint32_t prefixLen; + //destination, dest_prefix_len, source, src_prefix_len, next hop, metric, ref counter, use counter, flags, iface + while (fscanf(netRoute, "%*s %x %*s %*s %*s %*s %*s %*s %*s %" FF_STR(IF_NAMESIZE) "s", &prefixLen, iface) == 2) + { + if (prefixLen != 0) continue; + *ifIndex = if_nametoindex(iface); + return true; + } + iface[0] = '\0'; + return false; +} + +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +{ + if (getDefaultRouteIPv4(iface, ifIndex)) + return true; + + return getDefaultRouteIPv6(iface, ifIndex); +}