At 14:25 19/02/01 +0200, [EMAIL PROTECTED] wrote:
>Hi,
>   I encountered the following problem in the 4.2 version.
>In ip_forward, the following lines intend to save the mbuf in case we want to
>send ICMP error later:
>  mcopy = m_copy(m, 0, imin((int)ip->ip_len, 64));
>  if (mcopy && (mcopy->m_flags & M_EXT))
>      m_copydata(mcopy, 0, sizeof(struct ip), mtod(mcopy, caddr_t));
>
>Later on, before sending the ICMP packet we do:
>  if (mcopy->m_flags & M_EXT)
>      m_copyback(mcopy, 0, sizeof(struct ip), mtod(mcopy, caddr_t));
>
>The problem as I understand it is that the m_copydata and m_copyback, actually
>do nothing (It just
>copies from mcopy to itself).

I'm speaking from memory, so don't take this for more than it is:)

As far as I understand:
m_copym copies the mbuf, but if there is external storage, only pointers
are copied. so you get two mbuf chains with a common external storage.
m_copydata will copy the external storage.
that's why there are both m_copym and m_copydata. so while
   m_copydata(mcopy, .... (mcopy...))
is surprising, it's not nothing. it copies the data pointed to in mcopy.

cheers,
mouss



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to