' .
'
' .
'' . gettext($laggprotos[0]) . '
' .
gettext('This protocol is intended to do nothing: it disables any ' .
'traffic without disabling the lagg interface itself') .
'' .
'' .
'' . gettext($laggprotos[1]) . '
' .
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.') .
'' .
'' .
'' . gettext($laggprotos[2]) . '
' .
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.') .
'' .
'' .
'' . gettext($laggprotos[3]) . '
' .
gettext('Supports Cisco EtherChannel. This is a static setup and ' .
'does not negotiate aggregation with the peer or exchange ' .
'frames to monitor the link.') .
'' .
'' .
'' . gettext($laggprotos[4]) . '
' .
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') .
'' .
'' .
'' . gettext($laggprotos[5]) . '
' .
gettext('Distributes outgoing traffic using a round-robin scheduler ' .
'through all active ports and accepts incoming traffic from ' .
'any active port') .
'' .
'';
$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_once('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");