<?php
/*
Cisco Rate Limit Calculation Script
   by Tom Duff <tom.duff@gmail.com>
 Inspired by Dave Freedman's 'carcass.cgi' script at:
   http://www.convergence.cx/cgi-bin/carcass.cgi
*/
    //if the form hasn't been submitted, show the form.
if(!isset($_POST['speed'])){
    echo 
doForm();
}
else{
    
//do stuff when the form is submitted
    
$rate $_POST['speed'];
    
$magnitude $_POST['magnitude'];
    
$burst_time $_POST['burst_time'];
    switch (
$_POST['application']){
        case 
"bdrl":
            echo 
doForm($_POST['speed'], rate_limit($rate$magnitude$burst_time), $magnitude);
            break;
        case 
"udpol":
            echo 
doForm($_POST['speed'], uni_policer($rate$magnitude$burst_time), $magnitude);
            break;
        case 
"udshavg":
            echo 
doForm($_POST['speed'], uni_shaper_avg($rate$magnitude$burst_time), $magnitude);
            break;
        case 
"udshpk":
            echo 
doForm($_POST['speed'], uni_shaper_peak($rate$magnitude$burst_time), $magnitude);
            break;
    }
}

//displays the form
function doForm($rate$result$mag){
    if(!isset(
$result)){ $result "\n"; }
    if(!isset(
$rate)){ $rate ""; }
    if(!isset(
$mag)){
        
$magnitude '<option value="1" selected>Bits per Second</option>';
        
$magnitude .= '<option value="1000">Kilobits per Second</option>';
        
$magnitude .= '<option value="1000000">Megabits per Second</option>';
        
$magnitude .= '<option value="1000000000">Gigabits per Second</option>';
    }
    else{
        switch (
$mag){
            case 
"1":
                
$magnitude '<option value="1" selected>Bits per Second</option>';
                
$magnitude .= '<option value="1000">Kilobits per Second</option>';
                
$magnitude .= '<option value="1000000">Megabits per Second</option>';
                
$magnitude .= '<option value="1000000000">Gigabits per Second</option>';
                break;
            case 
"1000":
                
$magnitude '<option value="1">Bits per Second</option>';
                
$magnitude .= '<option value="1000" selected>Kilobits per Second</option>';
                
$magnitude .= '<option value="1000000">Megabits per Second</option>';
                
$magnitude .= '<option value="1000000000">Gigabits per Second</option>';
                break;
            case 
"1000000":
                
$magnitude '<option value="1">Bits per Second</option>';
                
$magnitude .= '<option value="1000">Kilobits per Second</option>';
                
$magnitude .= '<option value="1000000" selected>Megabits per Second</option>';
                
$magnitude .= '<option value="1000000000">Gigabits per Second</option>';
                break;
            case 
"1000000000":
                
$magnitude '<option value="1">Bits per Second</option>';
                
$magnitude .= '<option value="1000">Kilobits per Second</option>';
                
$magnitude .= '<option value="1000000">Megabits per Second</option>';
                
$magnitude .= '<option value="1000000000" selected>Gigabits per Second</option>';
                break;
        }
    }
    
    
$formspot = <<<FORM
    <html>
        <head><title>Rate Limiting Calculator</title></head>
        <body>
            <h2>Rate Limiting Calculator</h2>
            <form method="POST">
            <table border="1">
                <tr>
                    <td><b>Enter a Value</b>:</td>
                    <td>
                        <input type="text" name="speed" value="
$rate" />
                        <select name="magnitude"> 
                        
$magnitude
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>Select a Burst Time:</td>
                    <td>
                        <select name="burst_time"> 
                            <option value="1.5" selected> 1.5 Seconds (Recommended) </option> 
                            <option value="5"> 5 Seconds (Extended burst) </option> 
                        </select> 
                    </td>
                </tr>
                <tr>
                    <td>Select application:</td>
                    <td>
                        <select name="application"> 
                            <option value="bdrl" selected> Bidirectional Rate Limiter </option> 
                            <option value="udpol"> Unidirectional Policer </option> 
                            <option value="udshavg"> Unidirectional Shaper (average) </option> 
                            <option value="udshpk"> Unidirectional Shaper (peak) </option> 
                        </select> 
                    </td>
                </tr>
                <tr><td align="center" colspan="2"><input type="submit" name="submit" /></td></tr>
            </table>
            </form>
            <hr />
            
$result
        </body>
    </html>
FORM;
return 
$formspot;
}

//creates bidirectional rate-limiter statements
function rate_limit($rate$magnitude$bursttime){
    
$rate $rate $magnitude;
    
$burst = ($rate/8) * $bursttime;
    
$excess $burst 2;
    
$retval "<pre>";
    
$retval .= "\nrate-limit input $rate $burst $excess conform-action transmit exceed-action drop\n";
    
$retval .= "rate-limit output $rate $burst $excess conform-action transmit exceed-action drop\n";
    
$retval .= "</pre>";
    return 
$retval;
}

//creates a unidirectional policer statement
function uni_policer($rate$magnitude$bursttime){
    
$rate $rate $magnitude;
    
$burst = ($rate/8) * $bursttime;
    
$excess $burst 2;
    
$retval "<pre>";
    
$retval .= "\npolice $rate $burst $excess conform-action transmit exceed-action drop ";
    
$retval .= "</pre>";
    return 
$retval;
}

//creates a unidirectional shaper (average) statement
function uni_shaper_avg($rate$magnitude$bursttime){
    
$rate $rate $magnitude;
    
$excess $bursttime 2;
    
$retval "<pre>";
    
$retval .= "\nshape average $rate $bursttime $excess\n";
    
$retval .= "</pre>";
    return 
$retval;
}
//creates a unidirectional shaper (peak) statement
function uni_shaper_peak($rate$magnitude$bursttime){
    
$rate $rate $magnitude;
    
$excess $bursttime 2;
    
$retval "<pre>";
    
$retval .= "\nshape peak $rate $bursttime $excess\n";
    
$retval .= "</pre>";
    return 
$retval;
}