summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/inc/shaper.inc68
-rwxr-xr-xusr/local/www/firewall_shaper_queues.php95
2 files changed, 112 insertions, 51 deletions
diff --git a/etc/inc/shaper.inc b/etc/inc/shaper.inc
index 3fadcb2..21d931a 100644
--- a/etc/inc/shaper.inc
+++ b/etc/inc/shaper.inc
@@ -156,13 +156,17 @@ function is_subqueue_used_on_interface($queuename, $interface) {
if (!is_array($qconfig['shaper']['queue'])) return 0;
foreach ($qconfig['shaper']['queue'] as $queue) {
- if($queue['attachtoqueue'] == $queuename)
- $subqueue_interface = filter_is_queue_being_used_on_interface($queue['name'], $interface);
- /* Useful debugging code for when queues are messed up
- * echo "{$subqueue_interface}/{$interface}/{$queue['name']}/{$queuename}\n";
- */
- if ($subqueue_interface != ""){
- return 1;
+ if($queue['attachtoqueue'] == $queuename) {
+ /* recurse if we're a parent queue */
+ if ($queue['parentqueue'] == "on") {
+ return is_subqueue_used_on_interface($queue['name'], $interface);
+ }
+
+ /* If we're not a parent check to see if the queue is used on this interface */
+ $subqueue_interface = filter_is_queue_being_used_on_interface($queue['name'], $interface);
+ if ($subqueue_interface != ""){
+ return 1;
+ }
}
}
return 0;
@@ -199,28 +203,8 @@ function filter_setup_altq_interfaces() {
$queue_names = "";
$is_first = "";
- $workting_with_interface = $ifname;
-
- foreach ($config['shaper']['queue'] as $queue) {
- $rule_interface = "";
- $q = $queue;
- $rule_interface = filter_is_queue_being_used_on_interface($q['name'], $workting_with_interface);
- if ($rule_interface == $workting_with_interface) {
- if(!isset($q['attachtoqueue'])) {
- if($is_first) $queue_names .= ", ";
- $queue_names .= $q['name'];
- $is_first = "1";
- }
- } else {
- if(isset($q['parentqueue']) && ($q['parentqueue'] <> "")) {
- if(is_subqueue_used_on_interface($q['name'], $workting_with_interface)) {
- $queue_names .= " ";
- $queue_names .= $q['name'];
- }
- }
- }
+ $queue_names = find_root_queue($ifname);
- }
if($queue_names <> ""){
$altq_rules .= "altq on {$config['interfaces'][$ifname]['if']} ";
if($config['interfaces'][$ifname]['bandwidth'] <> "")
@@ -234,6 +218,34 @@ function filter_setup_altq_interfaces() {
return $altq_rules;
}
+/* Find the root queue for an interface */
+function find_root_queue($ifname) {
+ global $config;
+
+ $dbg = fopen("/tmp/debug", 'a');
+ foreach ($config['shaper']['queue'] as $queue) {
+ $rule_interface = "";
+ $q = $queue;
+ fwrite($dbg, "interface: {$ifname}\n");
+ fwrite($dbg, "queue: {$q['name']} parent: {$q['parentqueue']} attached: {$q['attachtoqueue']}\n");
+ /* if we're a parentqueue and aren't attached to another queue we're probably a root */
+ if ((isset($q['parentqueue']) && $q['parentqueue'] <> "") && (!isset($q['attachtoqueue']) || $q['attachtoqueue'] == "")) {
+ fwrite($dbg, "queue: {$q['name']} is a parent\n");
+ /* Confirm that this is a valid queue for this interface */
+ $rule_interface = is_subqueue_used_on_interface($q['name'], $ifname);
+ if ($rule_interface == 1) {
+ fwrite($dbg, "queue: {$q['name']} is a parent on {$ifname}\n");
+ $queue_names .= " ";
+ $queue_names .= $q['name'];
+ }
+ }
+ }
+ fclose($dbg);
+ return $queue_names;
+}
+
+
+
function is_queue_attached_children($name) {
global $config;
diff --git a/usr/local/www/firewall_shaper_queues.php b/usr/local/www/firewall_shaper_queues.php
index 1379ee6..a07538c 100755
--- a/usr/local/www/firewall_shaper_queues.php
+++ b/usr/local/www/firewall_shaper_queues.php
@@ -101,6 +101,53 @@ if ($_GET['act'] == "del") {
}
}
+if ($_POST) {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does -
+ so we use .x/.y to fine move button clicks instead... */
+ unset($movebtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ break;
+ }
+ }
+ /* move selected rules before this rule */
+ if (isset($movebtn) && is_array($_POST['queue']) && count($_POST['queue'])) {
+ $a_queue_new = array();
+
+ /* copy all rules < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['queue']))
+ $a_queue_new[] = $a_queues[$i];
+ }
+
+ /* copy all selected rules */
+ for ($i = 0; $i < count($a_queues); $i++) {
+ if ($i == $movebtn)
+ continue;
+ if (in_array($i, $_POST['queue']))
+ $a_queue_new[] = $a_queues[$i];
+ }
+
+ /* copy $movebtn rule */
+ if ($movebtn < count($a_queues))
+ $a_queue_new[] = $a_queues[$movebtn];
+
+ /* copy all rules > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_queues); $i++) {
+ if (!in_array($i, $_POST['queue']))
+ $a_queue_new[] = $a_queues[$i];
+ }
+
+ $a_queues = $a_queue_new;
+ write_config();
+ touch($d_shaperconfdirty_path);
+ header("Location: firewall_shaper_queues.php");
+ exit;
+ }
+}
+
+
$pgtitle = "Firewall: Shaper: Queues";
include("head.inc");
@@ -110,6 +157,7 @@ include("head.inc");
<?php include("fbegin.inc"); ?>
<p class="pgtitle"><?=$pgtitle?></p>
<form action="firewall_shaper_queues.php" method="post">
+<script type="text/javascript" language="javascript" src="row_toggle.js"></script>
<?php if ($input_errors) print_input_errors($input_errors); ?>
<?php if ($savemsg) print_info_box($savemsg); ?>
<?php if (file_exists($d_shaperconfdirty_path)): ?><p>
@@ -129,34 +177,34 @@ include("head.inc");
<td>
<div id="mainarea">
<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td width="5%" class="listhdrr">No.</td>
+ <tr id="frheader">
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="0%" class="list">&nbsp;</td>
<td width="5%" class="listhdrr">Flags</td>
<td width="5%" class="listhdrr">Priority</td>
<td width="5%" class="listhdr">Default</td>
<td width="5%" class="listhdr">Bandwidth</td>
- <td width="70%" class="listhdr">Name</td>
- <td width="10%" class="list"></td>
+ <td width="65%" class="listhdr">Name</td>
+ <td width="10%" class="list">&nbsp;</td>
</tr>
<?php $i = 0; foreach ($a_queues as $queue): ?>
- <tr valign="top">
- <td class="listlr" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
- <?=($i+1);?>
- </td>
- <td class="listlr" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
- <?php
- if($queue['red'] <> "") echo " RED";
- if($queue['rio'] <> "") echo " RIO";
- if($queue['ecn'] <> "") echo " ECN";
- if($queue['borrow'] <> "") echo " Borrow";
- if(isset($queue['ack'])) echo "ACK"
- ?>
- &nbsp;
+ <tr valign="top" id="fr<?=$i;?>">
+<td class="listt"><input type="checkbox" id="frc<?=$i;?>" name="queue[]" value="<?=$i;?>" onClick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;"></td>
+ <td class="listt" onClick="fr_toggle(<?=$i;?>)" id="frc<?=$i;?>" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">&nbsp;</td>
+ <td class="listr" onClick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
+<?php
+ if($queue['red'] <> "") echo " RED";
+ if($queue['rio'] <> "") echo " RIO";
+ if($queue['ecn'] <> "") echo " ECN";
+ if($queue['borrow'] <> "") echo " Borrow";
+ if(isset($queue['ack'])) echo "ACK"
+?>
+ &nbsp;
</td>
- <td class="listr" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
+ <td class="listr" onClick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
<?=$queue['priority'];?>&nbsp;
</td>
- <td class="listr" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
+ <td class="listr" onClick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
<?php
if($queue['defaultqueue'] <> "") {
echo "Yes";
@@ -165,17 +213,18 @@ include("head.inc");
}
?>
</td>
- <td class="listr" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
+ <td class="listr" onClick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
<?=htmlspecialchars($queue['bandwidth']);?> <?=htmlspecialchars($queue['bandwidthtype']);?>
&nbsp;
</td>
- <td class="listbg" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
+ <td class="listbg" onClick="fr_toggle(<?=$i;?>)" ondblclick="document.location='firewall_shaper_queues_edit.php?id=<?=$i;?>';">
<font color="#FFFFFF"><?=htmlspecialchars($queue['name']);?>
&nbsp;
</td>
<td valign="middle" nowrap class="list">
<table border="0" cellspacing="0" cellpadding="1">
<tr>
+ <td><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" width="17" height="17" title="move selected queue before this rule" onMouseOver="fr_insline(<?=$i;?>, true)" onMouseOut="fr_insline(<?=$i;?>, false)"></td>
<td valign="middle"><a href="firewall_shaper_queues_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0"></a></td>
<td valign="middle"><a href="firewall_shaper_queues.php?act=del&id=<?=$i;?>" onclick="return confirm('Do you really want to delete this queue?')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0"></a></td>
</tr>
@@ -184,7 +233,7 @@ include("head.inc");
</tr>
<?php $i++; endforeach; $total_queues = $i; ?>
<tr>
- <td class="list" colspan="6"></td>
+ <td class="list" colspan="7"></td>
<td class="list">
<table border="0" cellspacing="0" cellpadding="1">
<tr>
@@ -193,7 +242,7 @@ include("head.inc");
</table>
</td>
</tr>
- <tr><td colspan="6">
+ <tr><td colspan="7">
<p>
<strong><span class="red">Note:</span></strong><strong><br></strong>
A queue can only be deleted if it is not referenced by any rules.<br>
OpenPOWER on IntegriCloud