"") { $member = explode("-", $_POST["members{$x}"]); if (count($member) > 1) { if (preg_match("/([^0-9])+/", $member[0], $match) || preg_match("/([^0-9])+/", $member[1], $match)) $input_errors[] = "Tags can contain only numbers or a range in format #-#."; for ($i = $member[0]; $i <= $member[1]; $i++) { if ($isfirst > 0) $members .= " "; $members .= $i; $isfirst++; } } else { if (preg_match("/([^0-9])+/", $_POST["members{$x}"], $match)) $input_errors[] = "Tags can contain only numbers or a range in format #-#."; if ($isfirst > 0) $members .= " "; $members .= $_POST["members{$x}"]; $isfirst++; } } } if (!$input_errors) { $qinqentry['members'] = $members; $qinqentry['descr'] = mb_convert_encoding($_POST['descr'],"HTML-ENTITIES","auto"); $qinqentry['vlanif'] = "{$_POST['if']}_{$_POST['tag']}"; $nmembers = explode(" ", $members); if (isset($id) && $a_qinqs[$id]) { $omembers = explode(" ", $a_qinqs[$id]['members']); $delmembers = array_diff($omembers, $nmembers); if (count($delmembers) > 0) { foreach ($delmembers as $tag) { mwexec("/usr/sbin/ngctl shutdown {$qinqentry['vlanif']}h{$tag}:"); mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}qinq: delfilter \\\"{$qinqentry['vlanif']}{$tag}\\\""); } } $addmembers = array_diff($nmembers, $omembers); if (count($addmembers) > 0) { foreach ($addmembers as $member) { $macaddr = get_interface_mac($qinqentry['vlanif']); mwexec("/usr/sbin/ngctl mkpeer {$$qinqentry['vlanif']}qinq: eiface {$$qinqentry['vlanif']}{$member} ether"); mwexec("/usr/sbin/ngctl name {$qinqentry['vlanif']}qinq:{$qinqentry['vlanif']}{$tag} {$qinqentry['vlanif']}h{$member}"); mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}qinq: addfilter '{ vlan={$member} hook=\\\"{$qinqentry['vlanif']}{$member}\\\" }'"); mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}h{$tag}: setifname \\\"{$qinqentry['vlanif']}_{$member}\\\""); mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}h{$member}: set {$macaddr}"); } } $a_qinqs[$id] = $qinqentry; } else { interface_qinq_configure($qinqentry); $a_qinqs[] = $qinqentry; } if ($_POST['autogroup'] == "yes") { if (!is_array($config['ifgroups']['ifgroupentry'])) $config['ifgroups']['ifgroupentry'] = array(); foreach ($config['ifgroups']['ifgroupentry'] as $gid => $group) { if ($group['ifname'] == "QinQ") { $found = true; break; } } $additions = ""; foreach($nmembers as $qtag) $additions .= "{$qinqentry['vlanif']}_{$qtag} "; $additions .= "{$qinqentry['vlanif']}"; if ($found == true) $config['ifgroups']['ifgroupentry'][$gid]['members'] .= " {$additions}"; else { $gentry = array(); $gentry['ifname'] = "QinQ"; $gentry['members'] = "{$additions}"; $gentry['descr'] = "QinQ VLANs group"; $config['ifgroups']['ifgroupentry'][] = $gentry; } } write_config(); header("Location: interfaces_qinq.php"); exit; } else { $pconfig['descr'] = mb_convert_encoding($_POST['descr'],"HTML-ENTITIES","auto"); $pconfig['tag'] = $_POST['tag']; $pconfig['members'] = $members; } } include("head.inc"); ?> ">
Interface QinQ Edit
Parent interface
Only QinQ capable interfaces will be shown.
First level tag
This is the first level VLAN tag. On top of this are stacked the member VLANs defined below.
Options
/> Auto assign interface so it can be configured with ip etc...
/> Auto enable interface so it can be used on filter rules.
> Allows to keep clients mtu unchanged(1500).
NOTE: if you are using jumbo frames this option is not needed and may produce incorrect results!

> Adds interface to QinQ interface groups so you can write filter rules easily.
Description
You may enter a description here for your reference (not parsed).
Member (s)
You can specify ranges in the input below. The format is pretty simple i.e 9-100 or 10.20...
"") { $item = explode(" ", $members); foreach($item as $ww) { $members = $item[$counter]; $tracker = $counter; ?>
Tag