interfaces: kill VLAN creation side effect #5540

This commit is contained in:
Franco Fichtner 2022-02-10 09:52:06 +01:00
parent af59ab65b3
commit 0d74151ed8
2 changed files with 30 additions and 40 deletions

View File

@ -184,10 +184,6 @@ function interfaces_vlan_configure($verbose = false)
}
foreach ($config['vlans']['vlan'] as $vlan) {
if (empty($vlan['vlanif'])) {
$vlan['vlanif'] = "{$vlan['if']}_vlan{$vlan['tag']}";
}
interface_vlan_configure($vlan);
}
@ -196,31 +192,18 @@ function interfaces_vlan_configure($verbose = false)
}
}
function interface_vlan_configure(&$vlan)
function interface_vlan_configure($vlan)
{
if (!is_array($vlan)) {
log_error('VLAN: called with wrong options. Problems with config!');
return;
}
$if = $vlan['if'];
$vlanif = empty($vlan['vlanif']) ? "{$if}_vlan{$vlan['tag']}" : $vlan['vlanif'];
if (empty($if)) {
log_error('interface_vlan_configure called with if undefined.');
return;
}
interfaces_bring_up($if);
interfaces_bring_up($vlan['if']); /* XXX overreach? */
/* XXX avoid destroy/create */
legacy_interface_destroy($vlanif);
legacy_interface_create('vlan', $vlanif);
legacy_interface_destroy($vlan['vlanif']);
legacy_interface_create('vlan', $vlan['vlanif']);
$pcp = isset($vlan['pcp']) ? $vlan['pcp'] : 0;
legacy_vlan_tag($vlanif, $if, $vlan['tag'], $pcp);
legacy_vlan_tag($vlan['vlanif'], $vlan['if'], $vlan['tag'], $pcp);
interfaces_bring_up($vlanif);
return $vlanif;
interfaces_bring_up($vlan['vlanif']);
}
function interfaces_test_wireless_capability($if, $cap)

View File

@ -50,14 +50,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$id = $_POST['id'];
}
$input_errors = array();
$input_errors = [];
$pconfig = $_POST;
/* input validation */
$reqdfields = explode(" ", "if tag");
$reqdfieldsn = array(gettext("Parent interface"),gettext("VLAN tag"));
$reqdfieldsn = [gettext('Parent interface'), gettext('VLAN tag')];
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
if ($pconfig['tag'] && (!is_numericint($pconfig['tag']) || ($pconfig['tag'] < '1') || ($pconfig['tag'] > '4094'))) {
$input_errors[] = gettext("The VLAN tag must be an integer between 1 and 4094.");
@ -81,7 +81,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (isset($id) && $a_vlans[$id] === $vlan) {
continue;
}
if (($vlan['if'] == $pconfig['if']) && ($vlan['tag'] == $_POST['tag'])) {
if (($vlan['if'] == $pconfig['if']) && ($vlan['tag'] == $pconfig['tag'])) {
$input_errors[] = sprintf(gettext("A VLAN with the tag %s is already defined on this interface."), $vlan['tag']);
break;
}
@ -89,12 +89,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (count($input_errors) == 0) {
$confif = "";
$vlan = array();
$vlan['if'] = $_POST['if'];
$vlan['tag'] = $_POST['tag'];
$vlan = [];
$vlan['if'] = $pconfig['if'];
$vlan['tag'] = $pconfig['tag'];
$vlan['pcp'] = $pconfig['pcp'];
$vlan['descr'] = $_POST['descr'];
$vlan['vlanif'] = "{$_POST['if']}_vlan{$_POST['tag']}";
$vlan['descr'] = $pconfig['descr'];
$vlan['vlanif'] = "{$pconfig['if']}_vlan{$pconfig['tag']}";
if (isset($id)) {
if (($a_vlans[$id]['if'] != $pconfig['if']) || ($a_vlans[$id]['tag'] != $pconfig['tag']) || ($a_vlans[$id]['pcp'] != $pconfig['pcp'])) {
if (!empty($a_vlans[$id]['vlanif'])) {
@ -105,15 +105,21 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$confif = convert_real_interface_to_friendly_interface_name("{$a_vlans[$id]['if']}_vlan{$a_vlans[$id]['tag']}");
}
if ($confif != '') {
$config['interfaces'][$confif]['if'] = "{$_POST['if']}_vlan{$_POST['tag']}";
$config['interfaces'][$confif]['if'] = $vlan['vlanif'];
}
$vlan['vlanif'] = interface_vlan_configure($vlan);
}
} else {
$vlan['vlanif'] = interface_vlan_configure($vlan);
/*
* Since VLAN name is calculated we do not need to fetch one from the
* system. However, we would still like to know if the system can create
* another VLAN if it is being added like is done for other devices.
* Eventually we want to change VLAN device names in the newer FreeBSD
* parentX.ID style.
*/
$vlan['vlanif'] = legacy_interface_create('vlan', $vlan['vlanif']); /* XXX find another strategy */
}
ifgroup_setup();
if ($vlan['vlanif'] == "" || !stristr($vlan['vlanif'], "vlan")) {
if (empty($vlan['vlanif']) || strpos($vlan['vlanif'], '_vlan') === false) {
$input_errors[] = gettext("Error occurred creating interface, please retry.");
} else {
if (isset($id)) {
@ -122,7 +128,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$a_vlans[] = $vlan;
}
write_config();
interface_vlan_configure($vlan);
ifgroup_setup();
if ($confif != '') {
interface_configure(false, $confif);
}
@ -164,7 +171,7 @@ legacy_html_escape_form_data($pconfig);
<td>
<select name="if" class="selectpicker">
<?php
$all_interfaces = legacy_config_get_interfaces(array('virtual' => false));
$all_interfaces = legacy_config_get_interfaces(['virtual' => false]);
$all_interface_data = legacy_interfaces_details();
foreach ($all_interfaces as $intf) {
if (!empty($intf['if']) && !empty($all_interface_data[$intf['if']])) {