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)
This commit is contained in:
Alexander Motin 2007-04-20 08:42:08 +00:00
parent 8e8f114e62
commit ccffcb5147

View File

@ -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) if ((m = ng_ppp_addproto(m, proto, 1)) == NULL)
return (ENOBUFS); return (ENOBUFS);
/* Round-robin strategy */ /* Clear distribution plan */
if (priv->conf.enableRoundRobin ||
(m->m_pkthdr.len < priv->numActiveLinks * MP_MIN_FRAG_LEN)) {
activeLinkNum = priv->lastLink++ % priv->numActiveLinks;
bzero(&distrib, priv->numActiveLinks * sizeof(distrib[0])); bzero(&distrib, priv->numActiveLinks * sizeof(distrib[0]));
/* Round-robin strategy */
if (priv->conf.enableRoundRobin) {
activeLinkNum = priv->lastLink++ % priv->numActiveLinks;
distrib[activeLinkNum] = m->m_pkthdr.len; distrib[activeLinkNum] = m->m_pkthdr.len;
goto deliver; goto deliver;
} }
/* Strategy when all links are equivalent (optimize the common case) */ /* Strategy when all links are equivalent (optimize the common case) */
if (priv->allLinksEqual) { if (priv->allLinksEqual) {
const int fraction = m->m_pkthdr.len / priv->numActiveLinks; int numFrags, fraction, remain;
int i, remain; int i;
for (i = 0; i < priv->numActiveLinks; 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] distrib[priv->lastLink++ % priv->numActiveLinks]
= fraction; = fraction + (((remain--) > 0)?1:0);
remain = m->m_pkthdr.len - (fraction * priv->numActiveLinks);
while (remain > 0) {
distrib[priv->lastLink++ % priv->numActiveLinks]++;
remain--;
} }
goto deliver; goto deliver;
} }
@ -2162,7 +2170,6 @@ ng_ppp_mp_strategy(node_p node, int len, int *distrib)
t0 = ((len * 100) + topSum + botSum / 2) / botSum; t0 = ((len * 100) + topSum + botSum / 2) / botSum;
/* Compute f_i(t_0) all i */ /* Compute f_i(t_0) all i */
bzero(distrib, priv->numActiveLinks * sizeof(*distrib));
for (total = i = 0; i < numFragments; i++) { for (total = i = 0; i < numFragments; i++) {
int bw = priv->links[ int bw = priv->links[
priv->activeLinks[sortByLatency[i]]].conf.bandwidth; priv->activeLinks[sortByLatency[i]]].conf.bandwidth;