[build] Avoid strict-aliasing warnings when building with gcc 4.4
[people/lynusvaz/gpxe.git] / src / include / gpxe / socket.h
1 #ifndef _GPXE_SOCKET_H
2 #define _GPXE_SOCKET_H
3
4 /** @file
5  *
6  * Socket addresses
7  *
8  */
9
10 #include <stdint.h>
11
12 /**
13  * @defgroup commtypes Communication semantics
14  *
15  * @{
16  */
17
18 /** Connection-based, reliable streams */
19 extern int tcp_sock_stream;
20 #define TCP_SOCK_STREAM 0x1
21 #define SOCK_STREAM tcp_sock_stream
22
23 /** Connectionless, unreliable streams */
24 extern int udp_sock_dgram;
25 #define UDP_SOCK_DGRAM 0x2
26 #define SOCK_DGRAM udp_sock_dgram
27
28 /** @} */
29
30 /**
31  * Name communication semantics
32  *
33  * @v semantics         Communication semantics (e.g. SOCK_STREAM)
34  * @ret name            Name of communication semantics
35  */
36 static inline __attribute__ (( always_inline )) const char *
37 socket_semantics_name ( int semantics ) {
38         /* Cannot use a switch() because of the {TCP_UDP}_SOCK_XXX hack */
39         if ( semantics == SOCK_STREAM ) {
40                 return "SOCK_STREAM";
41         } else if ( semantics == SOCK_DGRAM ) {
42                 return "SOCK_DGRAM";
43         } else {
44                 return "SOCK_UNKNOWN";
45         }
46 }
47
48 /**
49  * @defgroup addrfam Address families
50  *
51  * @{
52  */
53 #define AF_INET         1       /**< IPv4 Internet addresses */
54 #define AF_INET6        2       /**< IPv6 Internet addresses */
55 /** @} */
56
57 /**
58  * Name address family
59  *
60  * @v family            Address family (e.g. AF_INET)
61  * @ret name            Name of address family
62  */
63 static inline __attribute__ (( always_inline )) const char *
64 socket_family_name ( int family ) {
65         switch ( family ) {
66         case AF_INET:           return "AF_INET";
67         case AF_INET6:          return "AF_INET6";
68         default:                return "AF_UNKNOWN";
69         }
70 }
71
72 /** A socket address family */
73 typedef uint16_t sa_family_t;
74
75 /** Length of a @c struct @c sockaddr */
76 #define SA_LEN 32
77
78 /**
79  * Generalized socket address structure
80  *
81  * This contains the fields common to socket addresses for all address
82  * families.
83  */
84 struct sockaddr {
85         /** Socket address family
86          *
87          * This is an AF_XXX constant.
88          */
89         sa_family_t sa_family;
90         /** Padding
91          *
92          * This ensures that a struct @c sockaddr_tcpip is large
93          * enough to hold a socket address for any TCP/IP address
94          * family.
95          */
96         char pad[ SA_LEN - sizeof ( sa_family_t ) ];
97 } __attribute__ (( may_alias ));
98
99 #endif /* _GPXE_SOCKET_H */