diff options
author | Alexander Motin <mav@FreeBSD.org> | 2007-04-20 08:42:08 +0000 |
---|---|---|
committer | Alexander Motin <mav@FreeBSD.org> | 2007-04-20 08:42:08 +0000 |
commit | ccffcb51476122f19a04c7733e3fa79dfbf6ec89 (patch) | |
tree | b4e623b991d6bccee2c4ca2e5fef1b5b2521a5e7 /sys/netgraph/ng_ppp.c | |
parent | 8e8f114e624166911b2cc3cde440577779a27485 (diff) | |
download | src-ccffcb51476122f19a04c7733e3fa79dfbf6ec89.tar.gz src-ccffcb51476122f19a04c7733e3fa79dfbf6ec89.zip |
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)
Notes
Notes:
svn path=/head/; revision=168897
Diffstat (limited to 'sys/netgraph/ng_ppp.c')
-rw-r--r-- | sys/netgraph/ng_ppp.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/sys/netgraph/ng_ppp.c b/sys/netgraph/ng_ppp.c index 0cdc0d7cdb08..25416e7d70f1 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; |