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:
parent
77e623bc9a
commit
d63525df51
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user