From: fendo Date: Tue, 3 Sep 2013 13:02:22 +0000 (+0200) Subject: improved load balancing algorithm. X-Git-Tag: 2.2.1-2sames3.12~1 X-Git-Url: http://git.sameswireless.fr/l2tpns.git/commitdiff_plain/ea2c9385938dc5ee481c9e7e677c03dc869b88cf?ds=sidebyside;hp=-c improved load balancing algorithm. --- ea2c9385938dc5ee481c9e7e677c03dc869b88cf diff --git a/grpsess.c b/grpsess.c index a4b63ab..ccaa27c 100644 --- a/grpsess.c +++ b/grpsess.c @@ -25,6 +25,14 @@ union grp_iphash { groupidt gnextgrpid = 0; +typedef struct +{ + sessionidt sid_loaddist[0x10000]; +} +local_group; + +local_group *grp_local = NULL; // Array of local_group structures. + // Find gruop by IP, < 1 for not found // // Confusingly enough, this 'ip' must be @@ -42,14 +50,6 @@ static groupidt grp_lookup_ipmap(in_addr_t ip) return h[*a].grp; } -typedef struct -{ - sessionidt sid_loaddist[0x10000]; -} -local_group; - -local_group *grp_local = NULL; // Array of local_group structures. - // // Take an IP address in HOST byte order and // add it to the grouid by IP cache. @@ -513,6 +513,7 @@ static void grp_uncache_ipsession(groupidt g, sessionidt s) } } +uint16_t guint16_index_loadlist; // return the next session can be used on the group sessionidt grp_getnextsession(groupidt g, in_addr_t ip, in_addr_t ip_src) { @@ -539,7 +540,8 @@ sessionidt grp_getnextsession(groupidt g, in_addr_t ip, in_addr_t ip_src) coutgrp_delta = session[s2].cout - grpsession[g].sesslist[i].prev_coutgrp; grpsession[g].sesslist[i].prev_coutgrp = session[s2].cout; - grpsession[g].sesslist[i].tx_rate = coutgrp_delta/ltime_changed; + txrate = (txrate + (coutgrp_delta/ltime_changed)) >> 1; + grpsession[g].sesslist[i].tx_rate = txrate; txrate = grpsession[g].sesslist[i].tx_rate/grpsession[g].sesslist[i].weight; if (txrate < mintxrate) @@ -583,19 +585,14 @@ sessionidt grp_getnextsession(groupidt g, in_addr_t ip, in_addr_t ip_src) if (g != grp_groupbysession(s)) { // This session does not belong to this group - LOG(2, s, session[s].tunnel, "Warning, the session does not belong to group %d\n", g); + LOG(3, s, session[s].tunnel, "Warning, the session does not belong to group %d\n", g); s = 0; grp_local[g].sid_loaddist[ai] = 0; } - else if (s == grpsession[g].smax) - { - s = grpsession[g].smin; - grp_local[g].sid_loaddist[ai] = s; - grpsession[g].smax = 0; - } else if ( (session[s].ppp.phase > Establish) && (time_now - session[s].last_packet <= (config->echo_timeout + 1)) ) { + grp_local[g].sid_loaddist[guint16_index_loadlist++] = 0; return s; } else