Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Nov 1999 14:51:13 -0500 (EST)
From:      Clinton Xavier Berni <xavier@cs.duke.edu>
To:        Julian Elischer <julian@whistle.com>
Cc:        "Parthasarathy M. Aji" <partha@cs.duke.edu>, freebsd-hackers@FreeBSD.ORG
Subject:   Re: ip checksum 
Message-ID:  <Pine.GSO.4.20.9911231446220.22305-100000@mackerel.cs.duke.edu>
In-Reply-To: <Pine.BSF.4.10.9911222144560.9392-100000@current1.whistle.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hey,
I am sort of confused with the parameters for IPsumReplaceShort function,
 I understand that I will pass the &ip-ip_sum for the cksump parameter.

but I am not able to understand wht  oldvap & newvalp stand for..

Xavier.



On Mon, 22 Nov 1999, Julian Elischer wrote:

> How many bytes have you changed?
> 
> is it possible that some of the values have already been ntohs()'d
> or something similar?
> 
> rather than recalculate the whole packet, just update the exisitng
> value.
> 
> there is an rfc for this but it took me a while to get 
> the code right in C on a 386. The trick is getting the 1s complement
> arithmetic right.
> 
> 
> 
>  #define FIXSUM16(c, op, np)                                           \
>     do {                                                                \
>       (c) -= (u_int16_t) ~*((u_int16_t *) (op));                        \
>       if ((c) < 0) {                                                    \
>         (c) += 0xffff;                                                  \
>       }                                                                 \
>       (c) -= (u_int16_t)  *((u_int16_t *) (np));                        \
>       if ((c) < 0) {                                                    \
>         (c) += 0xffff;                                                  \
>       }                                                                 \
>     } while (0)
> 
> 
> /* 
>  * IpsumReplaceShort()
>  * 
>  * Replace a 16 bit aligned (relative to the checksum) 16 bit value
>  * in a packet and change the IP/TCP/UDP checksum at the same time.
>  * 
>  * Works with both big and little endian machines(!)
>  *    
>  * If for some wierd reason you want to replace a nonaligned value,
>  * you need to byteswap it and the old value before doing the
>  * subtractions.
>  */
>       
> void
> IpsumReplaceShort(u_int16_t *cksump, u_int16_t *oldvalp, u_int16_t newval)
> {
>   register int  cksum;
>   
>   cksum = *cksump;
>   FIXSUM16(cksum, oldvalp, &newval);
>   *cksump = cksum;
>   *oldvalp = newval;
> } 
> 
> 
> On Tue, 23 Nov 1999, Parthasarathy M. Aji wrote:
> 
> > Hey,
> > 
> > I am trying to recompute the checksum of an IP packet. I use
> > netinet/in_chksum.c to do this. The values returned are not correct. I've
> > reset the ip_sum field to 0 before doing the sum. Is there something
> > missing?   
> > 
> > thanks
> > 
> > 
> > 
> > To Unsubscribe: send mail to majordomo@FreeBSD.org
> > with "unsubscribe freebsd-hackers" in the body of the message
> > 
> 
> 



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.20.9911231446220.22305-100000>