summaryrefslogtreecommitdiffstats
path: root/src/usr/local/www/interfaces_lagg_edit.php
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2015-08-26 15:12:02 -0300
committerRenato Botelho <renato@netgate.com>2015-08-26 15:12:02 -0300
commit03b19a93f4d8d870507ee96121cee4acd748dd2a (patch)
tree71a34e9e7e73d13de21cb4ad831799fb10c30df4 /src/usr/local/www/interfaces_lagg_edit.php
parent7f410a121522c5d0e2660256ae50c1fde1df3645 (diff)
parent30ce58ac1ea27b758d5112cb5a3b190c9760f010 (diff)
downloadpfsense-03b19a93f4d8d870507ee96121cee4acd748dd2a.zip
pfsense-03b19a93f4d8d870507ee96121cee4acd748dd2a.tar.gz
Merge branch 'master' into bootstrap
Diffstat (limited to 'src/usr/local/www/interfaces_lagg_edit.php')
-rw-r--r--src/usr/local/www/interfaces_lagg_edit.php262
1 files changed, 262 insertions, 0 deletions
diff --git a/src/usr/local/www/interfaces_lagg_edit.php b/src/usr/local/www/interfaces_lagg_edit.php
new file mode 100644
index 0000000..3a03172
--- /dev/null
+++ b/src/usr/local/www/interfaces_lagg_edit.php
@@ -0,0 +1,262 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_lagg_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-lagg-edit
+##|*NAME=Interfaces: LAGG: Edit page
+##|*DESCR=Allow access to the 'Interfaces: LAGG: Edit' page.
+##|*MATCH=interfaces_lagg_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['laggs']['lagg']))
+ $config['laggs']['lagg'] = array();
+
+$a_laggs = &$config['laggs']['lagg'];
+
+$portlist = get_interface_list();
+$laggprotos = array("none", "lacp", "failover", "fec", "loadbalance", "roundrobin");
+$laggprotosuc = array("NONE", "LACP", "FAILOVER", "FEC", "LOADBALANCE", "ROUNDROBIN");
+
+$protohelp =
+'<ul>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[0]) . '</strong><br />' .
+ gettext('This protocol is intended to do nothing: it disables any ' .
+ 'traffic without disabling the lagg interface itself') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[1]) . '</strong><br />' .
+ gettext('Supports the IEEE 802.3ad Link Aggregation Control Protocol ' .
+ '(LACP) and the Marker Protocol. LACP will negotiate a set ' .
+ 'of aggregable links with the peer in to one or more Link ' .
+ 'Aggregated Groups. Each LAG is composed of ports of the ' .
+ 'same speed, set to full-duplex operation. The traffic will ' .
+ 'be balanced across the ports in the LAG with the greatest ' .
+ 'total speed, in most cases there will only be one LAG which ' .
+ 'contains all ports. In the event of changes in physical ' .
+ 'connectivity, Link Aggregation will quickly converge to a ' .
+ 'new configuration.') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[2]) . '</strong><br />' .
+ gettext('Sends and receives traffic only through the master port. If ' .
+ 'the master port becomes unavailable, the next active port is ' .
+ 'used. The first interface added is the master port; any ' .
+ 'interfaces added after that are used as failover devices.') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[3]) . '</strong><br />' .
+ gettext('Supports Cisco EtherChannel. This is a static setup and ' .
+ 'does not negotiate aggregation with the peer or exchange ' .
+ 'frames to monitor the link.') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[4]) . '</strong><br />' .
+ gettext('Balances outgoing traffic across the active ports based on ' .
+ 'hashed protocol header information and accepts incoming ' .
+ 'traffic from any active port. This is a static setup and ' .
+ 'does not negotiate aggregation with the peer or exchange ' .
+ 'frames to monitor the link. The hash includes the Ethernet ' .
+ 'source and destination address, and, if available, the VLAN ' .
+ 'tag, and the IP source and destination address') .
+ '</li>' .
+ '<li>' .
+ '<strong>' . gettext($laggprotos[5]) . '</strong><br />' .
+ gettext('Distributes outgoing traffic using a round-robin scheduler ' .
+ 'through all active ports and accepts incoming traffic from ' .
+ 'any active port') .
+ '</li>' .
+'</ul>';
+
+$realifchecklist = array();
+/* add LAGG interfaces */
+if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ unset($portlist[$lagg['laggif']]);
+ $laggiflist = explode(",", $lagg['members']);
+ foreach ($laggiflist as $tmpif) {
+ $realifchecklist[get_real_interface($tmpif)] = $tmpif;
+ }
+ }
+}
+
+$checklist = get_configured_interface_list(false, true);
+
+foreach ($checklist as $tmpif) {
+ $realifchecklist[get_real_interface($tmpif)] = $tmpif;
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_laggs[$id]) {
+ $pconfig['laggif'] = $a_laggs[$id]['laggif'];
+ $pconfig['members'] = $a_laggs[$id]['members'];
+ $laggiflist = explode(",", $a_laggs[$id]['members']);
+ foreach ($laggiflist as $tmpif) {
+ unset($realifchecklist[get_real_interface($tmpif)]);
+ }
+ $pconfig['proto'] = $a_laggs[$id]['proto'];
+ $pconfig['descr'] = $a_laggs[$id]['descr'];
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "members proto");
+ $reqdfieldsn = array(gettext("Member interfaces"), gettext("Lagg protocol"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (is_array($_POST['members'])) {
+ foreach ($_POST['members'] as $member) {
+ if (!does_interface_exist($member)) {
+ $input_errors[] = gettext("Interface supplied as member is invalid");
+ }
+ }
+ } else if (!does_interface_exist($_POST['members'])) {
+ $input_errors[] = gettext("Interface supplied as member is invalid");
+ }
+
+ if (!in_array($_POST['proto'], $laggprotos)) {
+ $input_errors[] = gettext("Protocol supplied is invalid");
+ }
+
+ if (!$input_errors) {
+ $lagg = array();
+ $lagg['members'] = implode(',', $_POST['members']);
+ $lagg['descr'] = $_POST['descr'];
+ $lagg['laggif'] = $_POST['laggif'];
+ $lagg['proto'] = $_POST['proto'];
+ if (isset($id) && $a_laggs[$id]) {
+ $lagg['laggif'] = $a_laggs[$id]['laggif'];
+ }
+
+ $lagg['laggif'] = interface_lagg_configure($lagg);
+ if ($lagg['laggif'] == "" || !stristr($lagg['laggif'], "lagg")) {
+ $input_errors[] = gettext("Error occurred creating interface, please retry.");
+ } else {
+ if (isset($id) && $a_laggs[$id]) {
+ $a_laggs[$id] = $lagg;
+ } else {
+ $a_laggs[] = $lagg;
+ }
+
+ write_config();
+
+ $confif = convert_real_interface_to_friendly_interface_name($lagg['laggif']);
+ if ($confif != "")
+ interface_configure($confif);
+
+ header("Location: interfaces_lagg.php");
+ exit;
+ }
+ }
+}
+
+function build_member_list() {
+ global $pconfig, $portlist, $realifchecklist;
+
+ $memberlist = array('list' => array(),
+ 'selected' => array());
+
+ $members_array = explode(',', $pconfig['members']);
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (array_key_exists($ifn, $realifchecklist))
+ continue;
+
+ $memberlist['list'][$ifn] = $ifn . '(' . $ifinfo['mac'] . ')';
+
+ if (stristr($pconfig['members'], $ifn))
+ array_push($memberlist['selected'], $ifn);
+ }
+
+ return($memberlist);
+}
+
+$pgtitle = array(gettext("Interfaces"),gettext("LAGG"),gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+require('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('LAGG Configuration');
+
+$memberslist = build_member_list();
+
+$section->addInput(new Form_Select(
+ 'members[]',
+ 'Parent Interfaces',
+ $memberslist['selected'],
+ $memberslist['list'],
+ true // Allow multiples
+))->setHelp('Choose the members that will be used for the link aggregation.');
+
+$section->addInput(new Form_Select(
+ 'proto',
+ 'LAGG Protocol',
+ $pconfig['proto'],
+ array_combine($laggprotos, $laggprotosuc)
+))->setHelp($protohelp);
+
+$section->addInput(new Form_Input(
+ 'laggif',
+ null,
+ 'hidden',
+ $pconfig['laggif']
+));
+
+if (isset($id) && $a_laggs[$id]) {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+include("foot.inc"); \ No newline at end of file
OpenPOWER on IntegriCloud