projects
/
l2tpns.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: improved load balancing algorithm
[l2tpns.git]
/
grpsess.c
diff --git
a/grpsess.c
b/grpsess.c
index
e710709
..
a4b63ab
100644
(file)
--- a/
grpsess.c
+++ b/
grpsess.c
@@
-42,6
+42,14
@@
static groupidt grp_lookup_ipmap(in_addr_t ip)
return h[*a].grp;
}
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.
//
// Take an IP address in HOST byte order and
// add it to the grouid by IP cache.
@@
-447,6
+455,14
@@
void grp_initdata()
{
grpsession[i].state = GROUPEUNDEF;
}
{
grpsession[i].state = GROUPEUNDEF;
}
+
+ if (!(grp_local = shared_malloc(sizeof(local_group) * MAXGROUPE)))
+ {
+ LOG(0, 0, 0, "Error doing malloc for grp_local: %s\n", strerror(errno));
+ exit(1);
+ }
+ memset(grp_local, 0, sizeof(grp_local[0]) * MAXGROUPE);
+
}
// Update time_changed of the group
}
// Update time_changed of the group
@@
-498,7
+514,7
@@
static void grp_uncache_ipsession(groupidt g, sessionidt s)
}
// return the next session can be used on the group
}
// return the next session can be used on the group
-sessionidt grp_getnextsession(groupidt g, in_addr_t ip)
+sessionidt grp_getnextsession(groupidt g, in_addr_t ip
, in_addr_t ip_src
)
{
sessionidt s = 0, s2 = 0, s3 = 0;
int i;
{
sessionidt s = 0, s2 = 0, s3 = 0;
int i;
@@
-551,15
+567,30
@@
sessionidt grp_getnextsession(groupidt g, in_addr_t ip)
if ((s = sessionbyip(ip)))
{
if ((s = sessionbyip(ip)))
{
+ uint8_t *as = (uint8_t *) &ip_src;
+ uint8_t *ad = (uint8_t *) &ip;
+ uint16_t ai = ad[3];
+ ai <<= 8;
+ ai |= as[3];
+
+ s = grp_local[g].sid_loaddist[ai];
+ if (!s)
+ {
+ s = grpsession[g].smin;
+ grp_local[g].sid_loaddist[ai] = s;
+ }
+
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);
s = 0;
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);
s = 0;
+ grp_local[g].sid_loaddist[ai] = 0;
}
else if (s == grpsession[g].smax)
{
s = grpsession[g].smin;
}
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) &&
grpsession[g].smax = 0;
}
else if ( (session[s].ppp.phase > Establish) &&
@@
-570,6
+601,7
@@
sessionidt grp_getnextsession(groupidt g, in_addr_t ip)
else
{
s = 0;
else
{
s = 0;
+ grp_local[g].sid_loaddist[ai] = 0;
}
}
}
}