Re: Confuse with big endian bitwise field

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

 



On 2007-06-26 18:20:35 (+0800), Li YanBo <dreamfly281@xxxxxxxxx> 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;
> }
> 
> but I am confuse with how to assign the values to the fields
> "buff_tail_addr" and "payload_len", I think there  are two ways to
> assign values to them, but I don't know which is right?
> 
> eg: I declare a variable  struct xxx X;
> 
> 1: X.buff_tail_addr = 0x3456;                        X.payload_len = 0x20;
> 2: X.buff_tail_addr = cpu_to_be32(0x3456);    X.payload_len = 
> cpu_to_be16(0x20);
> 
> There are two way I think to assign values. Could anyone tell me which
> is right or both are wrong? I will be appreciate for any hints, thanks
> in advance!
> 
> BR
> 
> lyb

Disclaimer: I'm not exactly an expert, so someone tell me if I'm wrong.

You'll need to use cpu_to_be32, to make sure the values you assign are
big 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).

You should be able to test this if you write a small program to populate
that struct and then dump it byte per byte (or just use gdb to see the
content).

Kristof

--
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