From 703faa82ffbd4fa30e8ec2a05893d4fba498790e Mon Sep 17 00:00:00 2001 From: vnxme <46669194+vnxme@users.noreply.github.com> Date: Thu, 21 Jan 2021 17:00:24 +0300 Subject: [PATCH] interfaces.inc: Improve guess_interface_from_ip() (#4523) --- src/etc/inc/interfaces.inc | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index e48983510..654299a00 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -3757,34 +3757,25 @@ function get_real_interface($interface = 'wan', $family = 'all') function guess_interface_from_ip($ipaddress) { - if (!is_ipaddr($ipaddress)) { + if (is_ipaddrv4($ipaddress)) { + $family = "inet"; + } elseif (is_ipaddrv6($ipaddress)) { + $family = "inet6"; + } else { return false; } - if (is_ipaddrv4($ipaddress)) { - /* create a route table we can search */ - exec("/usr/bin/netstat -rnWf inet", $output, $ret); - foreach ($output as $line) { - if (preg_match("/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+[ ]+link[#]/", $line)) { - $fields = preg_split("/[ ]+/", $line); - if (ip_in_subnet($ipaddress, $fields[0])) { - return $fields[5]; - } - } - } - } - /* FIXME: This works from cursory testing, regexp might need fine tuning */ - if (is_ipaddrv6($ipaddress)) { - /* create a route table we can search */ - exec("/usr/bin/netstat -rnWf inet6", $output, $ret); - foreach ($output as $line) { - if (preg_match("/[0-9a-f]+[:]+[0-9a-f]+[:]+[\/][0-9]+/", $line)) { - $fields = preg_split("/[ ]+/", $line); - if (ip_in_subnet($ipaddress, $fields[0])) { - return $fields[5]; - } + + /* create a route table we can search */ + exec("/usr/bin/netstat -rnWf ".$family, $output, $ret); + foreach ($output as $line) { + $fields = preg_split("/\s+/", $line); + if (is_subnet($fields[0])) { + if (ip_in_subnet($ipaddress, $fields[0])) { + return $fields[5]; } } } + $ret = exec_command("/sbin/route -n get {$ipaddress} | /usr/bin/awk '/interface/ { print \$2; };'"); if (empty($ret)) { return false;