RE: Various 6.0 issues


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