interfaces: stop calling match_wireless_interface() everywhere #5987

Restructure return value of legacy_interface_listget() to return
WLAN-only devices present in the system and avoid returning null
value to simplify the couple of callers (some already assumed as
much).

Assume that <wireless/> node is properly set since console.inc
always did store this.  Not sure about wireless clones yet, but
will check and fix in the scope of this ticket anyway.

get_interface_list() moves to interfaces.lib.inc since it uses
most functions from there and util.inc should not want to know
about interface details in the first place.  We need this later
when we work through interfaces_assign.php for device iteration
reasons.
This commit is contained in:
Franco Fichtner 2022-08-24 12:02:16 +02:00
parent b33ed9e207
commit 2b9f029819
6 changed files with 167 additions and 175 deletions

View File

@ -101,6 +101,7 @@ function _set_networking_interfaces_ports($probe = false)
$key = null;
$iflist_all = get_interface_list(false, true);
$iflist_wlan = legacy_interface_listget('wlan');
$iflist_lagg = [];
$iflist = [];
@ -404,7 +405,7 @@ EOD;
$config['nat']['outbound']['mode'] = 'automatic';
}
if (match_wireless_interface($lanif)) {
if (in_array($lanif, $iflist_wlan)) {
config_read_array('interfaces', 'lan', 'wireless');
$config['interfaces']['lan']['if'] .= '_wlan0';
} elseif (isset($config['interfaces']['lan']['wireless'])) {
@ -440,7 +441,7 @@ EOD;
$config['interfaces']['wan']['blockpriv'] = true;
}
if (match_wireless_interface($wanif)) {
if (in_array($wanif, $iflist_wlan)) {
config_read_array('interfaces', 'wan', 'wireless');
$config['interfaces']['wan']['if'] .= '_wlan0';
} elseif (isset($config['interfaces']['wan']['wireless'])) {
@ -456,7 +457,7 @@ EOD;
config_read_array('interfaces', 'opt' . ($i + 1));
$config['interfaces']['opt' . ($i + 1)]['if'] = $optif[$i];
if (match_wireless_interface($optif[$i])) {
if (in_array($optif[$i], $iflist_wlan)) {
config_read_array('interfaces', 'opt' . ($i + 1), 'wireless');
$config['interfaces']['opt' . ($i + 1)]['if'] .= '_wlan0';
} elseif (isset($config['interfaces']['opt' . ($i + 1)]['wireless'])) {

View File

@ -91,40 +91,6 @@ function convert_128bit_to_ipv6($ip6bin)
return $ip6addr;
}
function match_wireless_interface($int)
{
$wireless_prefix = [
'an',
'ath',
'bwi',
'bwn',
'ipw',
'iwi',
'iwlwifi',
'iwm',
'iwn',
'malo',
'mwl',
'ndis',
'otus',
'ral',
'rsu',
'rtwn',
'rum',
'run',
'uath',
'upgt',
'ural',
'urtw',
'wi',
'wlan',
'wpi',
'zyd',
];
return preg_match('/^(' . implode('|', $wireless_prefix) . ')/', $int);
}
function interfaces_bring_up($interface)
{
legacy_interface_flags($interface, 'up');
@ -132,12 +98,7 @@ function interfaces_bring_up($interface)
function does_interface_exist($interface)
{
$ints = legacy_interface_listget();
if (empty($interface) || $ints == null || !in_array($interface, $ints)) {
return false;
} else {
return true;
}
return !empty($interface) && in_array($interface, legacy_interface_listget());
}
function interfaces_loopback_configure($verbose = false)
@ -2070,7 +2031,7 @@ EOD;
/* find which clones are up and bring them down */
$ifup = legacy_interface_listget('up');
$clones_up = array();
$clones_up = [];
foreach ($clone_list as $clone_if) {
if (in_array($clone_if, $ifup)) {
$clones_up[] = $clone_if;
@ -3523,7 +3484,8 @@ function get_real_interface($interface = 'wan', $family = 'all')
case 'ppp':
case 'pppoe':
case 'pptp':
if (isset($cfg['wireless']) || match_wireless_interface($cfg['if'])) {
if (isset($cfg['wireless'])) {
/* XXX in nominal case $cfg['if'] is already correct */
$realif = interface_get_wireless_clone($cfg['if']);
} else {
$realif = $cfg['if'];
@ -3542,7 +3504,8 @@ function get_real_interface($interface = 'wan', $family = 'all')
}
break;
default:
if (isset($cfg['wireless']) || match_wireless_interface($cfg['if'])) {
if (isset($cfg['wireless'])) {
/* XXX in nominal case $cfg['if'] is already correct */
$realif = interface_get_wireless_clone($cfg['if']);
} else {
$realif = $cfg['if'];
@ -3555,7 +3518,8 @@ function get_real_interface($interface = 'wan', $family = 'all')
// Wireless cloned NIC support (FreeBSD 8+)
// interface name format: $parentnic_wlanparentnic#
// example: ath0_wlan0
if (isset($cfg['wireless']) || match_wireless_interface($cfg['if'])) {
if (isset($cfg['wireless'])) {
/* XXX in nominal case $cfg['if'] is already correct */
$realif = interface_get_wireless_clone($cfg['if']);
} else {
$realif = $cfg['if'];
@ -3806,15 +3770,10 @@ function is_interface_wireless($interface)
global $config;
$friendly = convert_real_interface_to_friendly_interface_name($interface);
if (!isset($config['interfaces'][$friendly]['wireless'])) {
if (match_wireless_interface($interface)) {
config_read_array('interfaces', $friendly, 'wireless');
return true;
}
return false;
}
return true;
/* XXX we might consider checking clones if wireless node is not set by default */
return isset($config['interfaces'][$friendly]['wireless']);
}
function get_interface_mac($interface, $ifconfig_details = null)
@ -3889,8 +3848,8 @@ function get_interfaces_info($include_unlinked = false)
$all_intf_stats = legacy_interface_stats();
$gateways = new \OPNsense\Routing\Gateways($all_intf_details);
$ifup = legacy_interface_listget('up');
$result = array();
$interfaces = legacy_config_get_interfaces(array('virtual' => false));
$result = [];
$interfaces = legacy_config_get_interfaces(['virtual' => false]);
$known_interfaces = [];
foreach (array_keys($interfaces) as $ifdescr) {
$interfaces[$ifdescr]['if'] = get_real_interface($ifdescr);
@ -3913,8 +3872,8 @@ function get_interfaces_info($include_unlinked = false)
}
foreach ($interfaces as $ifdescr => $ifinfo) {
$ifinfo['status'] = (is_array($ifup) && in_array($ifinfo['if'], $ifup)) ? 'up' : 'down';
$ifinfo['statusv6'] = (is_array($ifup) && in_array($ifinfo['ifv6'], $ifup)) ? 'up' : 'down';
$ifinfo['status'] = in_array($ifinfo['if'], $ifup) ? 'up' : 'down';
$ifinfo['statusv6'] = in_array($ifinfo['ifv6'], $ifup) ? 'up' : 'down';
if (!empty($all_intf_details[$ifinfo['if']])) {
if (

View File

@ -1,7 +1,7 @@
<?php
/*
* Copyright (c) 2015-2021 Franco Fichtner <franco@opnsense.org>
* Copyright (c) 2015-2022 Franco Fichtner <franco@opnsense.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -26,12 +26,12 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
function legacy_interface_listget($flag = '')
function legacy_interface_listget($flag = 'all')
{
$cmd_wlan = 'sysctl -n net.wlan.devices';
$cmd = '/sbin/ifconfig -l';
$ifs_wlan = null;
$ifs = null;
$ifs_wlan = [];
$ifs = [];
exec($cmd_wlan . ' 2>&1', $out_wlan, $ret_wlan);
if (!$ret_wlan && !empty($out_wlan[0])) {
@ -40,8 +40,8 @@ function legacy_interface_listget($flag = '')
if ($flag === 'up') {
$cmd .= 'u';
} elseif ($flag === 'down') {
$cmd .= 'd';
} elseif ($flag === 'wlan') {
return ($ifs_wlan);
}
exec($cmd . ' 2>&1', $out, $ret);
@ -54,7 +54,7 @@ function legacy_interface_listget($flag = '')
$ifs = explode(' ', $out[0]);
}
if ($ifs_wlan != null) {
if (count($ifs_wlan)) {
$ifs = array_merge($ifs, $ifs_wlan);
}
@ -529,3 +529,106 @@ function configure_interface_hardware($ifs, $intf_details = null)
}
}
}
/*
* get_interface_list() - Return a list of all physical interfaces
* along with MAC, IPv4 and status.
*
* $only_active = false -- interfaces that are available in the system
* true -- interfaces that are physically connected
*
* $include_dmesg = false -- skip probing dmesg for more information
* true -- probe dmesg for more information
*/
function get_interface_list($only_active = false, $include_dmesg = false)
{
$dmesg_arr = [];
$iflist = [];
if ($include_dmesg) {
exec('/sbin/dmesg', $dmesg_arr);
}
/* list of virtual interface types */
$vfaces = [
'_stf',
'_vip',
'_vlan',
'_wlan',
'bridge',
'carp',
'enc',
'faith',
'gif',
'gre',
'ipfw',
'l2tp',
'lagg',
'lo',
'ng',
'ovpnc',
'ovpns',
'pflog',
'pfsync',
'plip',
'ppp',
'pppoe',
'pptp',
'qinq',
'sl',
'tap',
'tun',
'vlan',
];
$ifnames_up = legacy_interface_listget('up');
$ifnames = legacy_interface_listget();
$all_interfaces = legacy_config_get_interfaces(['virtual' => false]);
$all_interface_data = legacy_interfaces_details();
if ($only_active) {
$_ifnames = [];
$all_stats = legacy_interface_stats();
foreach ($ifnames as $ifname) {
$ifinfo = $all_stats[$ifname];
if (!empty($ifinfo['link state']) && $ifinfo['link state'] == '2') {
$_ifnames[] = $ifname;
}
}
$ifnames = $_ifnames;
}
foreach ($ifnames as $ifname) {
$tmp_ifnames = preg_split('/\d+/', $ifname);
if (count(array_intersect($tmp_ifnames, $vfaces))) {
continue;
}
$ifdata = !empty($all_interface_data[$ifname]) ? $all_interface_data[$ifname] : [];
$toput = [
'up' => in_array($ifname, $ifnames_up),
'ipaddr' => !empty($ifdata['ipv4'][0]['ipaddr']) ? $ifdata['ipv4'][0]['ipaddr'] : null,
'mac' => !empty($ifdata['macaddr']) ? $ifdata['macaddr'] : null,
'dmesg' => '',
];
foreach ($all_interfaces as $name => $int) {
if ($int['if'] == $ifname) {
$toput['friendly'] = $name;
break;
}
}
foreach ($dmesg_arr as $dmesg_line) {
$dmesg = [];
if (preg_match("/^{$ifname}: <(.*?)>/i", $dmesg_line, $dmesg) == 1) {
$toput['dmesg'] = $dmesg[1];
break;
}
}
$iflist[$ifname] = $toput;
}
return $iflist;
}

View File

@ -839,109 +839,6 @@ function get_configured_ip_addresses()
return $ip_array;
}
/*
* get_interface_list() - Return a list of all physical interfaces
* along with MAC, IPv4 and status.
*
* $only_active = false -- interfaces that are available in the system
* true -- interfaces that are physically connected
*
* $include_dmesg = false -- skip probing dmesg for more information
* true -- probe dmesg for more information
*/
function get_interface_list($only_active = false, $include_dmesg = false)
{
$dmesg_arr = [];
$iflist = [];
if ($include_dmesg) {
exec('/sbin/dmesg', $dmesg_arr);
}
/* list of virtual interface types */
$vfaces = [
'_stf',
'_vip',
'_vlan',
'_wlan',
'bridge',
'carp',
'enc',
'faith',
'gif',
'gre',
'ipfw',
'l2tp',
'lagg',
'lo',
'ng',
'ovpnc',
'ovpns',
'pflog',
'pfsync',
'plip',
'ppp',
'pppoe',
'pptp',
'qinq',
'sl',
'tap',
'tun',
'vlan',
];
$ifnames_up = legacy_interface_listget('up');
$ifnames = legacy_interface_listget();
$all_interfaces = legacy_config_get_interfaces(['virtual' => false]);
$all_interface_data = legacy_interfaces_details();
if ($only_active) {
$_ifnames = [];
$all_stats = legacy_interface_stats();
foreach ($ifnames as $ifname) {
$ifinfo = $all_stats[$ifname];
if (!empty($ifinfo['link state']) && $ifinfo['link state'] == '2') {
$_ifnames[] = $ifname;
}
}
$ifnames = $_ifnames;
}
foreach ($ifnames as $ifname) {
$tmp_ifnames = preg_split('/\d+/', $ifname);
if (count(array_intersect($tmp_ifnames, $vfaces))) {
continue;
}
$ifdata = !empty($all_interface_data[$ifname]) ? $all_interface_data[$ifname] : [];
$toput = [
'up' => in_array($ifname, $ifnames_up),
'ipaddr' => !empty($ifdata['ipv4'][0]['ipaddr']) ? $ifdata['ipv4'][0]['ipaddr'] : null,
'mac' => !empty($ifdata['macaddr']) ? $ifdata['macaddr'] : null,
'dmesg' => '',
];
foreach ($all_interfaces as $name => $int) {
if ($int['if'] == $ifname) {
$toput['friendly'] = $name;
break;
}
}
foreach ($dmesg_arr as $dmesg_line) {
$dmesg = [];
if (preg_match("/^{$ifname}: <(.*?)>/i", $dmesg_line, $dmesg) == 1) {
$toput['dmesg'] = $dmesg[1];
break;
}
}
$iflist[$ifname] = $toput;
}
return $iflist;
}
/****f* util/log_error
* NAME
* log_error - Sends a string to syslog with LOG_ERR severity.

View File

@ -34,6 +34,40 @@ require_once("rrd.inc");
require_once("system.inc");
require_once("interfaces.inc");
function match_wireless_interface($int)
{
$wireless_prefix = [
'an',
'ath',
'bwi',
'bwn',
'ipw',
'iwi',
'iwlwifi',
'iwm',
'iwn',
'malo',
'mwl',
'ndis',
'otus',
'ral',
'rsu',
'rtwn',
'rum',
'run',
'uath',
'upgt',
'ural',
'urtw',
'wi',
'wlan',
'wpi',
'zyd',
];
return preg_match('/^(' . implode('|', $wireless_prefix) . ')/', $int);
}
function link_interface_to_group($int)
{
global $config;

View File

@ -54,6 +54,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$pconfig['cloneif'] = $a_clones[$id]['cloneif'];
$pconfig['mode'] = $a_clones[$id]['mode'];
$pconfig['descr'] = $a_clones[$id]['descr'];
} else {
$pconfig = ['if' => '', 'cloneif' => '', 'mode' => 'bss', 'descr' => ''];
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input_errors = array();
@ -153,12 +155,8 @@ include("head.inc");
<td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Parent interface");?></td>
<td>
<select name="if" class="selectpicker">
<?php foreach (get_interface_list() as $ifn => $ifinfo): ?>
<?php if (match_wireless_interface($ifn)): ?>
<option value="<?= $ifn ?>" <?= $ifn == $pconfig['if'] ? 'selected="selected"' : '' ?>>
<?= html_safe($ifn) ?>
</option>
<?php endif ?>
<?php foreach (legacy_interface_listget('wlan') as $ifn): ?>
<option value="<?= $ifn ?>" <?= $ifn == $pconfig['if'] ? 'selected="selected"' : '' ?>><?= html_safe($ifn) ?></option>
<?php endforeach ?>
</select>
</td>