summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_ppp.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2007-04-20 08:42:08 +0000
committermav <mav@FreeBSD.org>2007-04-20 08:42:08 +0000
commit4eafee461500d3c8c094c57739cb3c9cd78afe96 (patch)
treeb4e623b991d6bccee2c4ca2e5fef1b5b2521a5e7 /sys/netgraph/ng_ppp.c
parent08eaeb92b2c38e948e3e4b3c65b9d9a99af584fa (diff)
downloadFreeBSD-src-4eafee461500d3c8c094c57739cb3c9cd78afe96.zip
FreeBSD-src-4eafee461500d3c8c094c57739cb3c9cd78afe96.tar.gz
Optimized packet distribution plan for the equal links case. Do not
split packet on fragments smaller then MP_MIN_FRAG_LEN to reduce total overhead. Reviewed by: archie Approved by: glebius (mentor)
Diffstat (limited to 'sys/netgraph/ng_ppp.c')
-rw-r--r--sys/netgraph/ng_ppp.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/sys/netgraph/ng_ppp.c b/sys/netgraph/ng_ppp.c
index 0cdc0d7..25416e7 100644
--- a/sys/netgraph/ng_ppp.c
+++ b/sys/netgraph/ng_ppp.c
@@ -1882,27 +1882,35 @@ ng_ppp_mp_xmit(node_p node, item_p item, uint16_t proto)
if ((m = ng_ppp_addproto(m, proto, 1)) == NULL)
return (ENOBUFS);
+ /* Clear distribution plan */
+ bzero(&distrib, priv->numActiveLinks * sizeof(distrib[0]));
+
/* Round-robin strategy */
- if (priv->conf.enableRoundRobin ||
- (m->m_pkthdr.len < priv->numActiveLinks * MP_MIN_FRAG_LEN)) {
+ if (priv->conf.enableRoundRobin) {
activeLinkNum = priv->lastLink++ % priv->numActiveLinks;
- bzero(&distrib, priv->numActiveLinks * sizeof(distrib[0]));
distrib[activeLinkNum] = m->m_pkthdr.len;
goto deliver;
}
/* Strategy when all links are equivalent (optimize the common case) */
if (priv->allLinksEqual) {
- const int fraction = m->m_pkthdr.len / priv->numActiveLinks;
- int i, remain;
-
- for (i = 0; i < priv->numActiveLinks; i++)
+ int numFrags, fraction, remain;
+ int i;
+
+ /* Calculate optimal fragment count */
+ numFrags = priv->numActiveLinks;
+ if (numFrags > m->m_pkthdr.len / MP_MIN_FRAG_LEN)
+ numFrags = m->m_pkthdr.len / MP_MIN_FRAG_LEN;
+ if (numFrags == 0)
+ numFrags = 1;
+
+ fraction = m->m_pkthdr.len / numFrags;
+ remain = m->m_pkthdr.len - (fraction * numFrags);
+
+ /* Assign distribution */
+ for (i = 0; i < numFrags; i++) {
distrib[priv->lastLink++ % priv->numActiveLinks]
- = fraction;
- remain = m->m_pkthdr.len - (fraction * priv->numActiveLinks);
- while (remain > 0) {
- distrib[priv->lastLink++ % priv->numActiveLinks]++;
- remain--;
+ = fraction + (((remain--) > 0)?1:0);
}
goto deliver;
}
@@ -2162,7 +2170,6 @@ ng_ppp_mp_strategy(node_p node, int len, int *distrib)
t0 = ((len * 100) + topSum + botSum / 2) / botSum;
/* Compute f_i(t_0) all i */
- bzero(distrib, priv->numActiveLinks * sizeof(*distrib));
for (total = i = 0; i < numFragments; i++) {
int bw = priv->links[
priv->activeLinks[sortByLatency[i]]].conf.bandwidth;
OpenPOWER on IntegriCloud