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>
