lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-users] Re: [lwip] Anyone Using An Architecture That Isn't little


From: Rod Boyce
Subject: [lwip-users] Re: [lwip] Anyone Using An Architecture That Isn't little or big endian?
Date: Thu, 09 Jan 2003 00:46:55 -0000

Might I be so bold as to suggest another approach which would be befinical for 
some of the more common tests and would eliminate the need to htons in the 
'C'code fragment you detail below.
htons and htonl are defines if I remember correctly so this will works well.  
But instead of performing the htons on the variable that will take up code 
space perform the htons on the constant in the case statment.  This whould 
then be removed from the code either by the pre-processor or the peep hole 
optomiser.  This would then mean that for every comparision with a constant 
the constans is already in the correct format for the machine and does not 
need a seperate set of constants for each type of endian.  I would suggest 
changing the code fragment below to look like this:

<etherarp.h>
#define ETHTYPE_ARP (htons(0x0806))
#define ETHERTYPE_IP (htons(0x0800))

<ethernetif.c>
    switch(ethhdr-type){
        case ETHTYPE_IP:

I beleive the rest is obvious this makes the code eaiser to read and from my 
experance in multi-platform code anything to make the code easier to read is 
a good thing and should be promoted.

I have seen this done with a lot of comerical IP stacks for multi-platforms.

Regards,
Rod Boyce.


On Mon, 19 Aug 2002 12:04, John C. Toman wrote:
> Just checking. I'm considering writing and submitting code which would
> eliminate many unnecessary byte swaps for little endian architectures,
> specifically for code constants, without affecting big endian
> architectures. I'm planning on making changes at least for my system and
> will contribute them back to the lwIP tree if others are interested. For
> instance, consider:
>
> Currently in lwIP (one example from etharp.h):
>
> #define ETHTYPE_ARP 0x0806
> #define ETHTYPE_IP  0x0800
>
> When these are used, they must be byte-swapped in the little endian case
> (from ethernetif.c):
>
>     switch(htons(ethhdr->type)) {
>     case ETHTYPE_IP:
>       arp_ip_input(netif, p);
>       pbuf_header(p, -14);
>       netif->input(p, netif);
>       break;
>     case ETHTYPE_ARP:
>       p = arp_arp_input(netif, ethernetif->ethaddr, p);
>       if(p != NULL) {
>         low_level_output(ethernetif, p);
>         pbuf_free(p);
>       }
>       break;
>
> With a #ifdef for LITTLE_ENDIAN systems in the header files, this
> example would become:
>
> etharp.h:
>
> #ifdef LITTLE_ENDIAN
> #  define ETHTYPE_ARP 0x0608
> #  define ETHTYPE_IP  0x0008
> #else
> #  define ETHTYPE_ARP 0x0806
> #  define ETHTYPE_IP  0x0800
> #endif
>
> Then the code piece in ethernetif.c loses the htons() call, saving code
> and execution time in the little endian case without harming the big
> endian case:
>
>     switch(ethhdr->type) {
>     case ETHTYPE_IP:
>       arp_ip_input(netif, p);
>       pbuf_header(p, -14);
>       netif->input(p, netif);
>       break;
>     case ETHTYPE_ARP:
>       p = arp_arp_input(netif, ethernetif->ethaddr, p);
>       if(p != NULL) {
>         low_level_output(ethernetif, p);
>         pbuf_free(p);
>       }
>       break;
>
> My thinking was that dozens of htons, htonl, ntohs and ntohl calls in
> lwIP could be eliminated this way or in similar ways, resulting in
> cleaner code, as well as smaller code size and increased performance for
> little endian systems.
>
> The one drawback I can see to this approach is if there are other
> architectures that store bytes differently than little or big endian,
> they would need to come up with their own constants that represent the
> network-storage format on their systems ...
>
> Regards,
>
> John
>
>
> [This message was sent through the lwip discussion list.]

[This message was sent through the lwip discussion list.]




reply via email to

[Prev in Thread] Current Thread [Next in Thread]