176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_SOCKET_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_SOCKET_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Socket addresses 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup commtypes Communication semantics 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{ 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Connection-based, reliable streams */ 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int tcp_sock_stream; 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define TCP_SOCK_STREAM 0x1 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SOCK_STREAM tcp_sock_stream 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Connectionless, unreliable streams */ 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int udp_sock_dgram; 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define UDP_SOCK_DGRAM 0x2 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SOCK_DGRAM udp_sock_dgram 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */ 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Name communication semantics 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v semantics Communication semantics (e.g. SOCK_STREAM) 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret name Name of communication semantics 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ (( always_inline )) const char * 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansocket_semantics_name ( int semantics ) { 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Cannot use a switch() because of the {TCP_UDP}_SOCK_XXX hack */ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( semantics == SOCK_STREAM ) { 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return "SOCK_STREAM"; 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if ( semantics == SOCK_DGRAM ) { 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return "SOCK_DGRAM"; 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return "SOCK_UNKNOWN"; 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup addrfam Address families 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{ 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define AF_INET 1 /**< IPv4 Internet addresses */ 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define AF_INET6 2 /**< IPv6 Internet addresses */ 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */ 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Name address family 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v family Address family (e.g. AF_INET) 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret name Name of address family 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ (( always_inline )) const char * 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansocket_family_name ( int family ) { 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch ( family ) { 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AF_INET: return "AF_INET"; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AF_INET6: return "AF_INET6"; 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return "AF_UNKNOWN"; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A socket address family */ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint16_t sa_family_t; 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Length of a @c struct @c sockaddr */ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SA_LEN 32 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Generalized socket address structure 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This contains the fields common to socket addresses for all address 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * families. 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct sockaddr { 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Socket address family 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is an AF_XXX constant. 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sa_family_t sa_family; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Padding 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This ensures that a struct @c sockaddr_tcpip is large 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * enough to hold a socket address for any TCP/IP address 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * family. 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char pad[ SA_LEN - sizeof ( sa_family_t ) ]; 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( may_alias )); 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _GPXE_SOCKET_H */ 102