Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Feb 2006 14:50:10 GMT
From:      Pieter de Boer <pieter@thedarkside.nl>
To:        freebsd-pf@FreeBSD.org
Subject:   Re: sparc64/93530: Incorrect checksums when using pf's route-to on sparc64
Message-ID:  <200602261450.k1QEoAEq075550@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR sparc64/93530; it has been noted by GNATS.

From: Pieter de Boer <pieter@thedarkside.nl>
To: bug-followup@freebsd.org,
 pieter@thedarkside.nl
Cc:  
Subject: Re: sparc64/93530: Incorrect checksums when using pf's route-to on sparc64
Date: Sun, 26 Feb 2006 15:48:18 +0100

 I've investigated some more and found an interesting heisenbug.
 
 =46rom pf.c, pf_route():
 
                 ip->ip_sum =3D 0;
                 if (sw_csum & CSUM_DELAY_IP) {
                         /* From KAME */
                         if (ip->ip_v =3D=3D IPVERSION &&
                             (ip->ip_hl << 2) =3D=3D sizeof(*ip)) {
                                 ip->ip_sum =3D in_cksum_hdr(ip);
                         } else {
                                 ip->ip_sum =3D in_cksum(m0, ip->ip_hl << 2);
                         }
                 }
 
 In the tests I've run, the in_cksum_hdr()-function is called, not the=20
 in_cksum() function. Ok,  I inserted some printf's to find the problem. My=
 =20
 new code looks like this:
 
                 ip->ip_sum =3D 0;
                 if (sw_csum & CSUM_DELAY_IP) {
 //                      printf("pf_route(): B1\n");
                         /* From KAME */
                         if (ip->ip_v =3D=3D IPVERSION &&
                             (ip->ip_hl << 2) =3D=3D sizeof(*ip)) {      =20
 //                              printf("pf_route: B2\n");     =20
                                 ip->ip_sum =3D in_cksum_hdr(ip);    =20
                         } else {
                         //      printf("pf_route: B3\n");
                                 ip->ip_sum =3D in_cksum(m0, ip->ip_hl << 2);
                         }
                 }
 With the printf B1 and B2 commented out, the checksums are wrong. With eith=
 er=20
 printf B1 or B2 not commented out, then the checksums are correct. My theor=
 y=20
 is that there's some caching issue between the ip->ip_sum =3D 0; at the top=
  and=20
 the assembly-code of in_cksum_hdr(). When a printf is inserted between the=
 =20
 ip->ip_sum =3D 0; and the in_cksum_hdr(), the cache is invalidated long bef=
 ore=20
 in_cksum_hdr() is called.=20
 
 Perhaps a Sparc64-hacker could take a look at the assembly output of=20
 pf_route() and determine whether this could be the case? :)
 
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200602261450.k1QEoAEq075550>