public inbox for ecos-discuss@sourceware.org
 help / color / mirror / Atom feed
From: Sturle Mastberg <sturle.mastberg@tandberg.net>
To: Gary Thomas <gary@mlbassoc.com>
Cc: eCos Discussion <ecos-discuss@ecos.sourceware.org>
Subject: Re: [ECOS] Possible fix for duplicated ARP entries in the FreeBSD stack
Date: Fri, 17 Jun 2005 10:58:00 -0000	[thread overview]
Message-ID: <42B2ACAD.5030608@tandberg.net> (raw)
In-Reply-To: <1119002495.13965.224.camel@hermes>

Gary Thomas wrote:
> On Fri, 2005-06-17 at 10:52 +0200, Sturle Mastberg wrote:
> 
>>Hello,
>>
>>For some time I've had problem with duplicated ARP entries that have 
>>caused all sorts of problems. I searched the archive and discovered that 
>>the problem had been reported before:
>> 
>>
>>http://sourceware.org/ml/ecos-discuss/2004-11/msg00097.html
>> 
>>
>>My proposal to a fix is to make the sockaddr_inarp struct 
>>(include/netinet/if_ether.h) equal in size to the sockaddr struct by 
>>padding it at the end. This is exactly what is done to the sockaddr_in 
>>struct (include/netinet/in.h) for different reasons.
>> 
>>
>>I reached this conclusion after I discovered that two virutally 
>>identical calls to rtalloc1 (net/route.c) returned different results. 
>>The first instance appears in arplookup (netinet/if_ether.c) where the 
>>first parameter to rtalloc1 is a struct sockaddr_inarp cast to a struct 
>>sockaddr. The second instance appears in ip_output (netinet/ip_output) 
>>via rtalloc_ign (net/route.c) where the first parameter to rtalloc1 is 
>>an actual struct sockaddr. The rtalloc1 function does a radix tree 
>>search with a call to the rn_match function (net/radix.c). A closer look 
>>at this code reveals that it does indeed depend on the size of the 
>>supplied struct.
>> 
>>
>>The only conclusion a can draw from this is that the three structs: 
>>sockaddr, sockaddr_in and sockaddr_inarp must all be of equal size. I 
>>have checked the FreeBSD source repository that this is the case for the 
>>original code.
>> 
>>
>>While browsing the FreeBSD source repository I discovered that the 
>>sa_data character array member of the sockaddr struct was increased in 
>>size in the eCos FreeBSD stack. Does anyone know why this increase was 
>>introduced in eCos?
> 
> 
> Can you provide the details of what you found?  i.e. exactly how
> these structures were modified during the port?  [more likely, you're
> looking at a newer version of the FreeBSD code than I used and the 
> changes happened in the BSD codebase]  In any case, then we can analyze
> how things are different and what might need to be done.
> 
> Thanks
> 

The sockaddr struct in socket.h v1.39.2.7 in FreeBSD (which is the 
version the eCos port is based on) looks like this:

struct sockaddr {
   u_char       sa_len;      /* total length */
   sa_family_t  sa_family;   /* address family */
   char         sa_data[14]; /* actually longer; address value */
};

This structure has remained unchanged in FreeBSD from first to current 
version. I suspect the somehwat curious size of sa_data is due to the 
fact that the size of this struct must match that of the sockaddr_inarp 
struct. Here is the whole revision history:

http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/socket.h

The first version of socket.h in the eCos source repository looks like this:

struct sockaddr {
   u_char       sa_len;      /* total length */
   sa_family_t  sa_family;   /* address family */
   char         sa_data[30]; /* actually longer; address value */
};

The sa_data member has increased 16 bytes in size for no apparent reason 
and hench the reason for my question.

This size increase will also likely lead to a performance degradation, 
since the radix tree search algorithm does a byte by byte comparison for 
an exact match whenever an ARP cache entry is looked up (which is for 
every packet that is sent). This comparison, as mentioned earlier, 
depends on the size of the supplied struct (sockaddr[_in[arp]]) and now 
it has to deal with a struct that is twice the size is once was.

Regards,
SM

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

  reply	other threads:[~2005-06-17 10:58 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-06-17  8:52 Sturle Mastberg
2005-06-17 10:01 ` Gary Thomas
2005-06-17 10:58   ` Sturle Mastberg [this message]
2005-06-17 11:30     ` Andrew Lunn
2005-06-17 12:53       ` Nick Garnett
2005-06-17 12:57         ` Gary Thomas
2005-06-20  9:05           ` [ECOS] RE : [ECOS] Possible fix for duplicated ARP entries in the FreeBSDstack Arnaud Chataignier
2005-06-20 10:12             ` [ECOS] " Sturle Mastberg
2005-06-20 10:26             ` [ECOS] " Nick Garnett

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42B2ACAD.5030608@tandberg.net \
    --to=sturle.mastberg@tandberg.net \
    --cc=ecos-discuss@ecos.sourceware.org \
    --cc=gary@mlbassoc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).