Re: Confuse with big endian bitwise field

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

 



On 6/28/07, Arjan van de Ven <arjan@xxxxxxxxxxxxx> wrote:
On Tue, 2007-06-26 at 18:20 +0800, Li YanBo wrote:
> hi all,
>
> I am try  to define a hardware specific struct, it is like below:
>
> struct xxx {
>         __be32 pdu_cnt:6;
>         __be32 y:3;
>         __be32 wep_key:2;
>         __be32 uses_wep_key:1;
>         __be32 keep_alive:1;
>         __be32 buff_tail_addr:19;
>
>         __be32 cts_11g:1;
>         __be32 rts_11g:1;
>         __be32 x:2;
>         __be32 frag_size:12;
>         __be32 payload_len:12;
>         __be32 frag_num:4;
> }

this isn't safe if you want to mimic hardware layout; the order of the
bits in the struct is different for little endian and big endian
machines...


Yes, I realize it now, and maybe shifting bits is a more portability solution.

Kristof wrote:
You'll need to use cpu_to_be32, to make sure the values you assign
arebig endian too. >You'll need to do this for every field larger than
8 bits (as endianness is not an issue if >there's only one byte).

I have done many tests and it seemed by using cpu_to_be32 to the field
larger than 8 bits is not a correct solution. it will generate wrong
data too. Anywhere the switch between Be to Le or from Le to Be is a
complex thing, because it is not just the order of bytes but also the
order of bits, I found a good article to describe this problem
"http://www.linuxjournal.com/article/6788";

Thank for all your suggestion.

BR

LiYanBo

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux