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