#ifndef _IPXE_SOCKET_H #define _IPXE_SOCKET_H /** @file * * Socket addresses * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include /** * @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 */