| #ifndef _GPXE_SOCKET_H |
| #define _GPXE_SOCKET_H |
| |
| /** @file |
| * |
| * Socket addresses |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER ); |
| |
| #include <stdint.h> |
| |
| /** |
| * @defgroup commtypes Communication semantics |
| * |
| * @{ |
| */ |
| |
| /** Connection-based, reliable streams */ |
| extern int tcp_sock_stream; |
| #define TCP_SOCK_STREAM 0x1 |
| #define SOCK_STREAM tcp_sock_stream |
| |
| /** Connectionless, unreliable streams */ |
| extern int udp_sock_dgram; |
| #define UDP_SOCK_DGRAM 0x2 |
| #define SOCK_DGRAM udp_sock_dgram |
| |
| /** @} */ |
| |
| /** |
| * Name communication semantics |
| * |
| * @v semantics Communication semantics (e.g. SOCK_STREAM) |
| * @ret name Name of communication semantics |
| */ |
| static inline __attribute__ (( always_inline )) const char * |
| socket_semantics_name ( int semantics ) { |
| /* Cannot use a switch() because of the {TCP_UDP}_SOCK_XXX hack */ |
| if ( semantics == SOCK_STREAM ) { |
| return "SOCK_STREAM"; |
| } else if ( semantics == SOCK_DGRAM ) { |
| return "SOCK_DGRAM"; |
| } else { |
| return "SOCK_UNKNOWN"; |
| } |
| } |
| |
| /** |
| * @defgroup addrfam Address families |
| * |
| * @{ |
| */ |
| #define AF_INET 1 /**< IPv4 Internet addresses */ |
| #define AF_INET6 2 /**< IPv6 Internet addresses */ |
| /** @} */ |
| |
| /** |
| * Name address family |
| * |
| * @v family Address family (e.g. AF_INET) |
| * @ret name Name of address family |
| */ |
| static inline __attribute__ (( always_inline )) const char * |
| socket_family_name ( int family ) { |
| switch ( family ) { |
| case AF_INET: return "AF_INET"; |
| case AF_INET6: return "AF_INET6"; |
| default: return "AF_UNKNOWN"; |
| } |
| } |
| |
| /** A socket address family */ |
| typedef uint16_t sa_family_t; |
| |
| /** Length of a @c struct @c sockaddr */ |
| #define SA_LEN 32 |
| |
| /** |
| * Generalized socket address structure |
| * |
| * This contains the fields common to socket addresses for all address |
| * families. |
| */ |
| struct sockaddr { |
| /** Socket address family |
| * |
| * This is an AF_XXX constant. |
| */ |
| sa_family_t sa_family; |
| /** Padding |
| * |
| * This ensures that a struct @c sockaddr_tcpip is large |
| * enough to hold a socket address for any TCP/IP address |
| * family. |
| */ |
| char pad[ SA_LEN - sizeof ( sa_family_t ) ]; |
| } __attribute__ (( may_alias )); |
| |
| #endif /* _GPXE_SOCKET_H */ |