Purpose of using __be16 inside a data structure?
Hi all, Please tell me the difference between using unsigned short and __be16 to declear a variable in a data structure. For example, in include/net/inet_sock.h, struct inet_sock is decleared as struct inet_sock { __be16 inet_dport; }; not struct inet_sock { unsigned short inet_dport; }; I think it has something to do with endianness. But I see that both __le16 and __be16 are unsigned short when using gcc with -E option for little-endian and big-endian platform. Can someone give me more information? * little-endian typedef unsigned short __u16; typedef __u16 __le16; typedef __u16 __be16; * big-endian typedef unsigned short __u16; typedef __u16 __le16; typedef __u16 __be16; Regards, GC
On Tue, Aug 09, 2011 at 03:25:52PM +0800, 陳國成 wrote:
Please tell me the difference between using unsigned short and __be16 to declear a variable in a data structure. For example, in include/net/inet_sock.h, struct inet_sock is decleared as struct inet_sock { __be16 inet_dport; }; not struct inet_sock { unsigned short inet_dport; }; I think it has something to do with endianness. But I see that both __le16 and __be16 are unsigned short when using gcc with -E option for little-endian and big-endian platform. Can someone give me more information? * little-endian typedef unsigned short __u16; typedef __u16 __le16; typedef __u16 __be16; * big-endian typedef unsigned short __u16; typedef __u16 __le16; typedef __u16 __be16;
Which platform? The atomic element size is 16-bit? Maybe you should take a look at __be32 and __le32. FYI: This is in the kernel types.h ---- #ifdef __CHECKER__ #define __bitwise__ __attribute__((bitwise)) #else #define __bitwise__ #endif #ifdef __CHECK_ENDIAN__ #define __bitwise __bitwise__ #else #define __bitwise #endif typedef __u16 __bitwise __le16; typedef __u16 __bitwise __be16; ---- -- Regards, Adam Lee -------------------------------------------------- E-mail: adam8157@gmail.com Website: http://www.adam8157.info --------------------------------------------------
Hi Adam, 1. Which platform? * little-endian ARM * big-endian MIPS 2. The atomic element size is 16-bit? No idea about this question. 3. Maybe you should take a look at __be32 and __le32. * little-endian # 1 "arch/arm/include/asm/types.h" 1 # 1 "include/asm-generic/int-ll64.h" 1 # 17 "include/asm-generic/int-ll64.h" typedef __signed__ char __s8; typedef unsigned char __u8; typedef __signed__ short __s16; typedef unsigned short __u16; typedef __signed__ int __s32; typedef unsigned int __u32; # 168 "include/linux/types.h" typedef __u16 __le16; typedef __u16 __be16; typedef __u32 __le32; typedef __u32 __be32; * big-endian # 21 "arch/mips/include/asm/types.h" # 1 "include/asm-generic/int-ll64.h" 1 # 17 "include/asm-generic/int-ll64.h" typedef __signed__ char __s8; typedef unsigned char __u8; typedef __signed__ short __s16; typedef unsigned short __u16; typedef __signed__ int __s32; typedef unsigned int __u32; # 168 "include/linux/types.h" typedef __u16 __le16; typedef __u16 __be16; typedef __u32 __le32; typedef __u32 __be32; I'm using Linux 2.6.30. Regards, GC 2011/8/24 Adam Lee <adam8157@gmail.com>:
On Tue, Aug 09, 2011 at 03:25:52PM +0800, 陳國成 wrote:
Please tell me the difference between using unsigned short and __be16 to declear a variable in a data structure. For example, in include/net/inet_sock.h, struct inet_sock is decleared as
struct inet_sock { __be16 inet_dport; };
not
struct inet_sock { unsigned short inet_dport; };
I think it has something to do with endianness. But I see that both __le16 and __be16 are unsigned short when using gcc with -E option for little-endian and big-endian platform. Can someone give me more information?
* little-endian typedef unsigned short __u16; typedef __u16 __le16; typedef __u16 __be16;
* big-endian typedef unsigned short __u16; typedef __u16 __le16; typedef __u16 __be16;
Which platform? The atomic element size is 16-bit? Maybe you should take a look at __be32 and __le32.
FYI: This is in the kernel types.h
---- #ifdef __CHECKER__ #define __bitwise__ __attribute__((bitwise)) #else #define __bitwise__ #endif #ifdef __CHECK_ENDIAN__ #define __bitwise __bitwise__ #else #define __bitwise #endif
typedef __u16 __bitwise __le16; typedef __u16 __bitwise __be16; ----
-- Regards, Adam Lee -------------------------------------------------- E-mail: adam8157@gmail.com Website: http://www.adam8157.info --------------------------------------------------
On Tue, Aug 9, 2011 at 12:25 AM, 陳國成 <gcchen.org@gmail.com> wrote:
Hi all,
Please tell me the difference between using unsigned short and __be16 to declear a variable in a data structure.
The purpose of this and similar artificial types is to allow the code to be written in an architecture-independent way. The name is chosen to reflect the behavior (signedness, capacity, precision, etc) that is desired, and the headers for each architecture typedef it to a standard C type that accomplishes this goal. From the name, I expect this to be a 16-bit type. It may have other attributes, such as a specific endianness (unusual except in networking), or specific signedness. Except on unusual or antique architectures, I would expect this one to resolve to "short" or "unsigned short", but other possibilities exist.
What you should usually do is to find the typedef of __be16 in the headers and see if there is a clue to what use this type is intended for. -- Kevin O'Gorman, PhD
On Mon, Oct 24, 2011 at 12:54:41PM -0700, Kevin O'Gorman wrote:
On Tue, Aug 9, 2011 at 12:25 AM, 陳國成 <gcchen.org@gmail.com> wrote:
Hi all,
Please tell me the difference between using unsigned short and __be16 to declear a variable in a data structure. [...] accomplishes this goal. From the name, I expect this to be a 16-bit type. It may have other attributes, such as a specific endianness (unusual except
Yes, it's for 16-bit big-endian data. -- Jonathan Neuschäfer
participants (4)
-
Adam Lee -
Jonathan Neuschäfer -
Kevin O'Gorman -
陳國成