Discussion:
Purpose of using __be16 inside a data structure?
陳國成
2011-08-14 00:41:29 UTC
Permalink
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
Michael Blizek
2011-08-14 06:21:02 UTC
Permalink
Hi!
Post by 陳國成
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;
};
This is mostly to avoid confusion about where byte order conversation has to
be done. When reading "unsigned short" you would normally expect the variable
to contain host byte order.

-Michi
--
programing a layer 3+4 network protocol for mesh networks
see http://michaelblizek.twilightparadox.com
陳國成
2011-08-09 07:25:52 UTC
Permalink
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
Adam Lee
2011-08-24 05:16:17 UTC
Permalink
Post by 陳國成
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: ***@gmail.com
Website: http://www.adam8157.info
--------------------------------------------------
陳國成
2011-08-25 05:41:32 UTC
Permalink
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
Post by Adam Lee
Post by 陳國成
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
--------------------------------------------------
Website: http://www.adam8157.info
--------------------------------------------------
Kevin O'Gorman
2011-10-24 19:54:41 UTC
Permalink
Post by 陳國成
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
Jonathan Neuschäfer
2011-10-25 14:25:12 UTC
Permalink
Post by Kevin O'Gorman
Post by 陳國成
Hi all,
Please tell me the difference between using unsigned short and __be16 to
declear a variable in a data structure.
[...]
Post by Kevin O'Gorman
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

Loading...