summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Ullrich <sullrich@pfsense.org>2005-02-09 17:33:00 +0000
committerScott Ullrich <sullrich@pfsense.org>2005-02-09 17:33:00 +0000
commit315373b8e1c331dde1090b729a48e42172fd9d47 (patch)
treebcb4977bba822f905af821aefb84329a6adf3cae
parent8c280191bc98e3712ff87c33cdccc1f1f5017f68 (diff)
downloadpfsense-315373b8e1c331dde1090b729a48e42172fd9d47.zip
pfsense-315373b8e1c331dde1090b729a48e42172fd9d47.tar.gz
Add Chris's load balancing code.
-rw-r--r--etc/inc/lb.inc175
1 files changed, 175 insertions, 0 deletions
diff --git a/etc/inc/lb.inc b/etc/inc/lb.inc
new file mode 100644
index 0000000..3ffd8e6
--- /dev/null
+++ b/etc/inc/lb.inc
@@ -0,0 +1,175 @@
+<?php
+/*
+ lb.php
+ part of pfSense (www.pfSense.com)
+
+ Copyright (C) 2005 Chris Dionissopoulos <chdio@bug.gr>
+ 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.
+*/
+
+/*
+global config data
+~~~~~~~~~~~~~~~~~~
+['lb'] --> unique,required
+['lb']['enable'] --> unique , required, int(0|1)
+['lb']['gateway'] --> ARRAY , optional
+['lb']['gateway']['enable'] --> unique , required, int(0|1)
+['lb']['gateway']['state'] --> unique , required, int(0|1)
+['lb']['gateway']['gateway'] --> unique , required, string
+['lb']['gateway']['monitor'] --> unique , required, string
+['lb']['gateway']['weight'] --> unique , required, int(1..10)
+['lb']['gateway']['default'] --> unique , optional, int(0|1)
+
+*/
+
+require_once("functions.inc");
+
+ function addgateway($enable,$state,$gateway,$monitor,$weight,$default){
+ global $config,$g;
+ $exists = false;
+ $lb = &$config['lb'];
+
+ foreach($lb['gateway'] as $tgate)
+ if ($gateway == $tgate['gateway']){
+ $exists = true;
+ break;
+ }
+ }
+ if (!$exists) {
+ $tgate = array();
+ $tgate['enable'] = $enable;
+ if ($enable)
+ $tgate['state'] = $this->getstate($monitor);
+ else
+ $tgate['state'] = 0;
+ $tgate['gateway'] = $gateway;
+ $tgate['monitor'] = $monitor;
+ $tgate['weight'] = $weight;
+ if ($default==1) {
+ $i=0;
+ foreach($lb['gateway'] as $ttgate) {
+ if (isset($this->lb['gateway'][$i]['default']))
+ unset($this->lb['gateway'][$i]['default']);
+ $i++;
+ }
+ $tgate['default'] = 1;
+ } else
+ $tgate['default'] = 0;
+ $lb['gateway'][] = $tgate;
+ return true;
+ } else {
+ return "error: gateway exists!";
+ }
+
+ function edit_gateway($num,$enable,$state,$gateway,$monitor,$weight,$default){
+ global $config,$g;
+ $i=0;
+ $exists = false;
+ $lb = &$config['lb'];
+
+ foreach($lb['gateway'] as $tgate)
+ if ($gateway == $tgate['gateway'] && $i!=$num){
+ $exists = true;
+ break;
+ }
+ $i++;
+ }
+ if (!$exists) {
+ $tgate = array();
+ $tgate['enable'] = $enable;
+ if ($enable)
+ $tgate['state'] = get_state($monitor);
+ else
+ $tgate['state'] = 0;
+ $tgate['gateway'] = $gateway;
+ $tgate['monitor'] = $monitor;
+ $tgate['weight'] = $weight;
+ if ($default==1) {
+ $i=0;
+ foreach($lb['gateway'] as $ttgate){
+ if (isset($lb['gateway'][$i]['default']))
+ unset($lb['gateway'][$i]['default']);
+ $i++;
+ }
+ $tgate['default'] = 1;
+ } else
+ $tgate['default'] = 0;
+ $lb['gateway'][$num] = $tgate;
+ return true;
+ } else {
+ return "error: gateway exists!";
+ }
+
+ function get_state($ip){
+ $pingcmd = exec("/usr/local/bin/sudo /sbin/ping -c1 -t1 -n ".$ip,$result);
+ if (preg_match_all('/.*100\%\spacket\sloss.*/',$result[count($result)-1], $match))
+ return 0;
+ if (preg_match_all('/.*0\%\spacket\sloss.*/',$result[count($result)-2], $match))
+ return 1;
+ }
+
+ function rules(){
+ global $config,$g;
+ $lb = &$config['lb'];
+ $lancfg = $config['interfaces']['lan'];
+ $wancfg = $config['interfaces']['wan'];
+ $out_flow = ' ip from '.$lancfg['ipaddr'].'/'.$lancfg['subnet']
+ .' to not '. $lancfg['ipaddr'].'/'.$lancfg['subnet'];
+ $in_flow = 'ip from not '.$lancfg['ipaddr'].'/'.$lancfg['subnet']
+ .' to '.$lancfg['ipaddr'].'/'.$lancfg['subnet'];
+
+ $rules ="";
+ $num = 1;
+ $i=0;
+ foreach($lb['gateway'] as $tgate){
+ $num++;
+ $in_num = 10000+$num;
+ $out_num = 11000+$num;
+ $skipto = 20000 + $num*10;
+ $sw[$i] = 0;
+ for($j=$i;$j<$gates;$j++)
+ $sw[$i] +=$lb['gateway'][$j]['weight'];
+ $prob = round($tgate['weight']/$sw[$i], 2);
+
+ $rules .='/sbin/ipfw add $in_num set 5 skipto '.$skipto
+ .' '.$in_flow.' mac any '.arp_get_mac_by_ip($tgate['gateway'])
+ .' in recv '.$wancfg['if'].' keep-state\n';
+
+ $rules .='/sbin/ipfw add $out_num set 6 skipto '.$skipto
+ .' prob '.$prob.' '.$out_flow.' in recv '. $lancfg['if'].' keep-state\n';
+
+ $rules .='/sbin/ipfw add $skipto set 6 fwd '.$tgate['gateway']
+ .' '.$out_flow.' in recv '.$lancfg['if'].'\n';
+
+ $skipto++;
+ $rule .= '/sbin/ipfw add $skipto set 6 skipto 65535 ip from any to any\n';
+ $i++;
+ }
+ return $rules;
+ }
+
+
+
+
+?>
OpenPOWER on IntegriCloud