Subject: RE: Various 6.0 issues
From: Wessels, Hans (H.Wessels@energie-delfland.nl)
Date: Fri Jun 04 1999 - 00:58:36 PDT
Hi Alvin,
>
>5) ping gives me:
>
>64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.2 ms
>wrong data byte #8 should be 0x8 but was 0xb1
> c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22
>23 24 25 26 27 28 29 2a 2b
> 2c 2d 2e 2f 0 0 0 0 0 0 0 0 0 0 0 0
This issue has been in the list several times.
Solution:
----------------------------->8-----------------------------------------
Message-ID: <373C443A.4B574A75@ife.ee.ethz.ch>
Date: Fri, 14 May 1999 17:41:46 +0200
From: Alex Rhomberg <rhomberg@ife.ee.ethz.ch>
Organization: Electronics Lab, ETH Zurich, Switzerland
ping in netkit 0.11+ assumes that timeval has a length of eight bytes
and works with 32 bit alignment. This is no longer the case on my Alphas
running Linux 2.2.5 and Redhat 6.0 (might be due to glibc 2.1??)
Ping generated unaligned traps and erroneously reported receiving of
wrong data.
This is fixed by the following patch. Note that I did not read the whole
code but just made some wild guesses. The unaligned traps and the wrong
data errors are gone.
Regards
- Alex
--- ping.unpatched.c Fri May 14 17:30:50 1999
+++ ping.c Fri May 14 17:31:06 1999
@@ -394,7 +394,7 @@
exit(2);
}
if (!(options & F_PINGFILLED))
- for (i = 8; i < datalen; ++i)
+ for (i = sizeof(struct timeval); i < datalen; ++i)
*datap++ = i;
ident = getpid() & 0xFFFF;
@@ -657,11 +657,18 @@
return; /* 'Twas not our ECHO */
++nreceived;
if (timing) {
+ struct timeval temp_tv;
#ifndef icmp_data
tp = (struct timeval *)(icp + 1);
#else
tp = (struct timeval *)icp->icmp_data;
#endif
+ if((long)tp % sizeof(tp->tv_sec))
+ {
+ char *unaligned_pointer = (char *)tp;
+ tp = &temp_tv;
+ memcpy(tp, unaligned_pointer, sizeof(struct
timeval));
+ }
tvsub(&tv, tp);
triptime = tv.tv_sec * 10000 + (tv.tv_usec /
100);
tsum += triptime;
@@ -697,9 +704,9 @@
(void)printf(" (DUP!)");
/* check the data */
#ifndef icmp_data
- cp = ((u_char*)(icp + 1) + 8);
+ cp = ((u_char*)(icp + 1) + sizeof(struct
timeval));
#else
- cp = (u_char*)icp->icmp_data + 8;
+ cp = (u_char*)icp->icmp_data + sizeof(struct
timeval);
#endif
dp = &outpack[8 + sizeof(struct timeval)];
for (i = 8; i < datalen; ++i, ++cp, ++dp) {
-- _________________________________________________________________ / \ | Alex Rhomberg Tel: +41 1 632 49 18 | | Institut fuer Elektronik Fax: +41 1 632 12 10 | | ETH Zuerich Zentrale: +41 1 632 11 11 | | Gloriastrasse 35 | | 8092 Zuerich email: rhomberg@ife.ee.ethz.ch | \_________________________________________________________________/I strongly suspect that doing an uncoditional copy instead of testing 'tp' every time would be an overal win - but this is only a hunch. If you do the test then at least do: if( 0 != ((long)tp & (sizeof(tp->tv_sec) - 1))) and move a declaration of temp_tv inside of a block, as I suspect that a compiler will be not smart enough, but basically that is it.
Wait a minute, an alignment on 8 bytes boundary, i.e. " & (sizeof(long) - 1)", should be good enough. Details, details....
Michal
-----------------------------8<----------------------------------------- ------------------ Bye, Hans ---------------------------------------------------------------------- /| /\/\/\ |\ ir. Hans Wessels / | / /\/\ \ | \ H.Wessels@Energie-Delfland.nl / | / / /\ \ \ | \ tel.: 015 251 4397 / |/ / / \ \ \| \ \ |\ \ \ / / /| / prive: \ | \ \ \/ / / | / mr_ni@mbh.org \ | \ \/\/ / | / Fidelus Bittus et Fuckus Clockcyclus! \| \/\/\/ |/
-- To unsubscribe: send e-mail to axp-list-request@redhat.com with 'unsubscribe' as the subject. Do not send it to axp-list@redhat.com
This archive was generated by hypermail 2a22 : Wed Jun 30 1999 - 19:27:25 PDT