summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorslioch <slioch@eng-140.vyatta.com>2009-06-02 15:47:59 -0700
committerslioch <slioch@eng-140.vyatta.com>2009-06-02 16:08:45 -0700
commit16d937141226777cf030d02e87a96b7e4c9c8edb (patch)
tree084966f60d0d762598aa125a17774ea62016feb5 /src
parent3f808deb0a81976df125f56755fefeb987dd57ab (diff)
downloadvyatta-wanloadbalance-16d937141226777cf030d02e87a96b7e4c9c8edb.tar.gz
vyatta-wanloadbalance-16d937141226777cf030d02e87a96b7e4c9c8edb.zip
fix for bug 4409. Additional dynamic support for dynamic policy route and snat when wlb is configured and during runtime. also fix for wlb when running in
debug mode.
Diffstat (limited to 'src')
-rw-r--r--src/lbdecision.cc43
-rw-r--r--src/lboutput.cc2
2 files changed, 15 insertions, 30 deletions
diff --git a/src/lbdecision.cc b/src/lbdecision.cc
index 5373b9e..7030cf3 100644
--- a/src/lbdecision.cc
+++ b/src/lbdecision.cc
@@ -174,19 +174,26 @@ LBDecision::update_paths(LBData &lbdata)
//first let's remove the entry
LBData::InterfaceHealthIter iter = lbdata._iface_health_coll.begin();
while (iter != lbdata._iface_health_coll.end()) {
- if (iter->second._nexthop == "dhcp") {
+ if (iter->second._is_active == true) {
string iface = iter->first;
string new_addr = fetch_iface_addr(iface);
+ char buf[20];
+ sprintf(buf,"%d",iter->second._interface_index);
+
+ //now let's update the nexthop here in the route table
+ if (iter->second._nexthop == "dhcp") {
+ string nexthop = fetch_iface_nexthop(iface);
+ insert_default(string("ip route replace table ") + buf + " default dev " + iface + " via " + nexthop, iter->second._interface_index);
+ }
+ else {
+ insert_default(string("ip route replace table ") + buf + " default dev " + iface + " via " + iter->second._nexthop, iter->second._interface_index);
+ }
+
if (new_addr != iter->second._address) {
- char buf[20];
- sprintf(buf,"%d",iter->second._interface_index);
execute(string("iptables -t nat -D WANLOADBALANCE -m connmark --mark ") + buf + " -j SNAT --to-source " + iter->second._address, stdout);
execute(string("iptables -t nat -A WANLOADBALANCE -m connmark --mark ") + buf + " -j SNAT --to-source " + new_addr, stdout);
iter->second._address = new_addr;
- //now let's update the nexthop here in the route table
- string nexthop = fetch_iface_nexthop(iface);
- execute(string("ip route replace table ") + buf + " default dev " + iface + " via " + nexthop, stdout);
}
}
++iter;
@@ -217,26 +224,7 @@ LBDecision::run(LBData &lb_data)
cout << "LBDecision::run(), state changed, applying new rule set" << endl;
}
- //now reapply the routing tables.
- LBData::InterfaceHealthIter h_iter = lb_data._iface_health_coll.begin();
- while (h_iter != lb_data._iface_health_coll.end()) {
- if (h_iter->second._is_active == true) {
- char buf[40];
- sprintf(buf,"%d",h_iter->second._interface_index);
- if (h_iter->second._nexthop == "dhcp") {
- string nexthop = fetch_iface_nexthop(h_iter->first);
- insert_default(string("ip route replace table ") + buf + " default dev " + h_iter->first + " via " + nexthop, h_iter->second._interface_index);
- }
- else {
- insert_default(string("ip route replace table ") + buf + " default dev " + h_iter->first + " via " + h_iter->second._nexthop, h_iter->second._interface_index);
- }
- }
- else {
- //right now replace route, but don't delete until race condition is resolved
- // execute(string("ip route delete ") + route_str);
- }
- ++h_iter;
- }
+ update_paths(lb_data);
//first determine if we need to alter the rule set
if (!lb_data.state_changed()) {
@@ -542,10 +530,7 @@ LBDecision::insert_default(string cmd, int table)
showcmd += string(buf);
execute(showcmd,stdout,true);
- // cout << "LBDecision::insert_default(stdout): '" << stdout << "'" << endl;
-
if (stdout.empty() == true) {
- // cout << "LBDecision::insert_default(cmd): " << cmd << endl;
execute(cmd,stdout);
}
}
diff --git a/src/lboutput.cc b/src/lboutput.cc
index 8d60054..a20a72e 100644
--- a/src/lboutput.cc
+++ b/src/lboutput.cc
@@ -172,7 +172,7 @@ LBOutput::write(const LBData &lbdata)
LBData::LBRuleConstIter r_iter = lbdata._lb_rule_coll.begin();
while (r_iter != lbdata._lb_rule_coll.end()) {
cout << "squirt out results here." << endl;
+ ++r_iter;
}
- ++r_iter;
}
}