Try to make the MBUF_FRAG_TEST code work better.

- Don't try to fragment the packet if it's smaller than mbuf_frag_size.
- Preserve the size of the mbuf chain which is modified by m_split().
- Check that m_split() didn't return NULL.
- Make it so we don't end up with two M_PKTHDR mbuf in the chain.
- Use m->m_pkthdr.len instead of m->m_len so that we fragment the whole
  chain and not just the first mbuf.
- Fix a nearby style bug and rework the logic of the loops so that it's
  more clear.

This is still not quite right, because we're clearly abusing m_split() to
do something it was not designed for, but at least it works now.  We
should probably move this code into a m_fragment() function when it's
correct.
This commit is contained in:
Maxime Henrion 2003-03-25 23:49:14 +00:00
parent 84b7dcad85
commit 511e01e2d6

View File

@ -1021,25 +1021,23 @@ ip_output(m0, opt, ro, flags, imo, inp)
#endif
#ifdef MBUF_FRAG_TEST
if (mbuf_frag_size) {
if (mbuf_frag_size && m->m_pkthdr.len > mbuf_frag_size) {
struct mbuf *m1, *m2;
int length;
int length, tmp;
length = m->m_len;
tmp = length = m->m_pkthdr.len;
while (1) {
length -= mbuf_frag_size;
if (length < 1)
break;
while ((length -= mbuf_frag_size) >= 1) {
m1 = m_split(m, length, M_DONTWAIT);
if (m1 == NULL)
break;
m1->m_flags &= ~M_PKTHDR;
m2 = m;
while (1) {
if (m2->m_next == NULL)
break;
while (m2->m_next != NULL)
m2 = m2->m_next;
}
m2->m_next = m1;
m2->m_next = m1;
}
m->m_pkthdr.len = tmp;
}
#endif
error = (*ifp->if_output)(ifp, m,