/src/include/ipxe/socket.h
C Header | 146 lines | 55 code | 19 blank | 72 comment | 10 complexity | e79e9daac44a4883aac75c7022022962 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
- #ifndef _IPXE_SOCKET_H
- #define _IPXE_SOCKET_H
- /** @file
- *
- * Socket addresses
- *
- */
- FILE_LICENCE ( GPL2_OR_LATER );
- #include <stdint.h>
- #include <ipxe/tables.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
- /** Echo testing streams */
- extern int ping_sock_echo;
- #define PING_SOCK_ECHO 0x3
- #define SOCK_ECHO ping_sock_echo
- /** @} */
- /**
- * 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 if ( semantics == SOCK_ECHO ) {
- return "SOCK_ECHO";
- } else {
- return "SOCK_UNKNOWN";
- }
- }
- /**
- * @defgroup addrfam Address families
- *
- * @{
- */
- #define AF_INET 1 /**< IPv4 Internet addresses */
- #define AF_INET6 2 /**< IPv6 Internet addresses */
- #define AF_FC 3 /**< Fibre Channel 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";
- case AF_FC: return "AF_FC";
- 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__ (( packed, may_alias ));
- /**
- * Socket address converter
- *
- */
- struct sockaddr_converter {
- /** Socket address family
- *
- * This is an AF_XXX constant.
- */
- sa_family_t family;
- /** Transcribe socket address
- *
- * @v sa Socket address
- * @ret string Socket address string
- */
- const char * ( * ntoa ) ( struct sockaddr *sa );
- /** Parse socket address
- *
- * @v string Socket address stringh
- * @v sa Socket address to fill in
- * @ret rc Return status code
- */
- int ( * aton ) ( const char *string, struct sockaddr *sa );
- };
- /** Socket address converter table */
- #define SOCKADDR_CONVERTERS \
- __table ( struct sockaddr_converter, "sockaddr_converters" )
- /** Declare a socket address converter */
- #define __sockaddr_converter __table_entry ( SOCKADDR_CONVERTERS, 01 )
- extern const char * sock_ntoa ( struct sockaddr *sa );
- extern int sock_aton ( const char *string, struct sockaddr *sa );
- #endif /* _IPXE_SOCKET_H */