>[redirected to -net]
>
>On Wed, Feb 21, 2001 at 09:50:58AM +0000, [EMAIL PROTECTED] wrote:
>> >On Mon, Feb 19, 2001 at 08:26:56PM +0100, mouss wrote:
>> > > 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).
>>
>You are right, the code does nothing, though it was supposed to
>preserve the byte order of IP header fields in case ip_output()
>modifies them. The idea was to save the standard IP header in
>some area in mbuf that is unused for M_EXT mbufs, but obviously
>mtod() place is wrong, it points to the external data for M_EXT
>mbuf. Could you please try this patch:
>
>Index: ip_input.c
>===================================================================
>RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v
>retrieving revision 1.130.2.12
>diff -u -p -r1.130.2.12 ip_input.c
>--- ip_input.c 2001/02/01 20:25:09 1.130.2.12
>+++ ip_input.c 2001/02/21 16:48:10
>@@ -1513,7 +1513,8 @@ ip_forward(m, srcrt)
> */
> 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));
>+ m_copydata(mcopy, 0, sizeof(struct ip),
>+ (caddr_t)(&mcopy->m_ext + 1));
>
> #ifdef IPSTEALTH
> if (!ipstealth) {
>@@ -1661,7 +1662,8 @@ ip_forward(m, srcrt)
> return;
> }
> if (mcopy->m_flags & M_EXT)
>- m_copyback(mcopy, 0, sizeof(struct ip), mtod(mcopy, caddr_t));
>+ m_copyback(mcopy, 0, sizeof(struct ip),
>+ (caddr_t)(&mcopy->m_ext + 1));
> icmp_error(mcopy, type, code, dest, destifp);
> }
>
>And if that does not work, this (more clear but slower) one:
>
>Index: ip_input.c
>===================================================================
>RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v
>retrieving revision 1.130.2.13
>diff -u -p -r1.130.2.13 ip_input.c
>--- ip_input.c 2001/02/07 01:03:13 1.130.2.13
>+++ ip_input.c 2001/02/21 16:10:35
>@@ -1510,9 +1510,17 @@ ip_forward(m, srcrt)
> * we need to generate an ICMP message to the src.
> */
> 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));
>
>+ /*
>+ * Make sure the copy is read-write.
>+ */
>+ if (mcopy && (mcopy->m_flags & M_EXT)) {
>+ struct mbuf *mtemp = mcopy;
>+
>+ mcopy = m_dup(mtemp, M_DONTWAIT);
>+ m_freem(mtemp);
>+ }
>+
> #ifdef IPSTEALTH
> if (!ipstealth) {
> #endif
>@@ -1658,8 +1666,6 @@ ip_forward(m, srcrt)
> m_freem(mcopy);
> return;
> }
>- if (mcopy->m_flags & M_EXT)
>- m_copyback(mcopy, 0, sizeof(struct ip), mtod(mcopy, caddr_t));
> icmp_error(mcopy, type, code, dest, destifp);
> }
>
>
>Cheers,
>--
>Ruslan Ermilov Oracle Developer/DBA,
>[EMAIL PROTECTED] Sunbay Software AG,
>[EMAIL PROTECTED] FreeBSD committer,
>+380.652.512.251 Simferopol, Ukraine
>
>http://www.FreeBSD.org The Power To Serve
>http://www.oracle.com Enabling The Information Age
The first one works (I guess the second one also). Its nice trick.
If you could just add a line or two of remarks it would be great.
something like:
/* saving ip header for future use because ip_output might change it */
Thanks, Ido
_________________________________________
Get Your Free Virus Protection Tool at http://www.VCatch.com
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message