Fix regression from r287779, that bite me. If we call m_pullup()

unconditionally, we end up with an mbuf chain of two mbufs, which
later in in_arpreply() is rewritten from ARP request to ARP reply
and is sent out. Looks like igb(4) (at least mine, and at least
at my network) fails on such mbuf chain, so ARP reply doesn't go
out wire. Thus, make the m_pullup() call conditional, as it is
everywhere. Of course, the bug in igb(?) should be investigated,
but better first fix the head. And unconditional m_pullup() was
suboptimal, anyway.
This commit is contained in:
Gleb Smirnoff 2015-10-07 13:10:26 +00:00
parent e40e8705db
commit 89bc042679
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=288991

View File

@ -531,12 +531,15 @@ arpintr(struct mbuf *m)
ar = mtod(m, struct arphdr *);
/* Check if length is sufficient */
if ((m = m_pullup(m, arphdr_len(ar))) == NULL) {
ARP_LOG(LOG_NOTICE, "short packet received on %s\n",
if_name(ifp));
return;
if (m->m_len < arphdr_len(ar)) {
m = m_pullup(m, arphdr_len(ar));
if (m == NULL) {
ARP_LOG(LOG_NOTICE, "short packet received on %s\n",
if_name(ifp));
return;
}
ar = mtod(m, struct arphdr *);
}
ar = mtod(m, struct arphdr *);
hlen = 0;
layer = "";