For something that is called u_int16_t, I wouldn't expect it to be a structure. I would have expected something like this, YMMV.
Code:
typedef unsigned short u_short;
typedef unsigned long u_long;
typedef unsigned char u_int8_t;
typedef unsigned short u_int16_t;
typedef unsigned long u_int32_t;
I know that the reason for these typedefs is to try make this code easier to port to platforms with different size ints, but in my opinion it just obfuscates code.
Having said that, this is one of very few situations I break from my avoidance of typedefs. But I would prefer to make the typedefs match the exact-width integer type identifiers defined in C99, with suitable wrappers.
Code:
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901
#include <stdint.h>
#else /* typedefs specific to a platform */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#endif