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:
parent
8e8f114e62
commit
ccffcb5147
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user