PageRenderTime 38ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/src/include/ipxe/socket.h

https://github.com/Shopify/ipxe
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
  1. #ifndef _IPXE_SOCKET_H
  2. #define _IPXE_SOCKET_H
  3. /** @file
  4. *
  5. * Socket addresses
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER );
  9. #include <stdint.h>
  10. #include <ipxe/tables.h>
  11. /**
  12. * @defgroup commtypes Communication semantics
  13. *
  14. * @{
  15. */
  16. /** Connection-based, reliable streams */
  17. extern int tcp_sock_stream;
  18. #define TCP_SOCK_STREAM 0x1
  19. #define SOCK_STREAM tcp_sock_stream
  20. /** Connectionless, unreliable streams */
  21. extern int udp_sock_dgram;
  22. #define UDP_SOCK_DGRAM 0x2
  23. #define SOCK_DGRAM udp_sock_dgram
  24. /** Echo testing streams */
  25. extern int ping_sock_echo;
  26. #define PING_SOCK_ECHO 0x3
  27. #define SOCK_ECHO ping_sock_echo
  28. /** @} */
  29. /**
  30. * Name communication semantics
  31. *
  32. * @v semantics Communication semantics (e.g. SOCK_STREAM)
  33. * @ret name Name of communication semantics
  34. */
  35. static inline __attribute__ (( always_inline )) const char *
  36. socket_semantics_name ( int semantics ) {
  37. /* Cannot use a switch() because of the {TCP_UDP}_SOCK_XXX hack */
  38. if ( semantics == SOCK_STREAM ) {
  39. return "SOCK_STREAM";
  40. } else if ( semantics == SOCK_DGRAM ) {
  41. return "SOCK_DGRAM";
  42. } else if ( semantics == SOCK_ECHO ) {
  43. return "SOCK_ECHO";
  44. } else {
  45. return "SOCK_UNKNOWN";
  46. }
  47. }
  48. /**
  49. * @defgroup addrfam Address families
  50. *
  51. * @{
  52. */
  53. #define AF_INET 1 /**< IPv4 Internet addresses */
  54. #define AF_INET6 2 /**< IPv6 Internet addresses */
  55. #define AF_FC 3 /**< Fibre Channel addresses */
  56. /** @} */
  57. /**
  58. * Name address family
  59. *
  60. * @v family Address family (e.g. AF_INET)
  61. * @ret name Name of address family
  62. */
  63. static inline __attribute__ (( always_inline )) const char *
  64. socket_family_name ( int family ) {
  65. switch ( family ) {
  66. case AF_INET: return "AF_INET";
  67. case AF_INET6: return "AF_INET6";
  68. case AF_FC: return "AF_FC";
  69. default: return "AF_UNKNOWN";
  70. }
  71. }
  72. /** A socket address family */
  73. typedef uint16_t sa_family_t;
  74. /** Length of a @c struct @c sockaddr */
  75. #define SA_LEN 32
  76. /**
  77. * Generalized socket address structure
  78. *
  79. * This contains the fields common to socket addresses for all address
  80. * families.
  81. */
  82. struct sockaddr {
  83. /** Socket address family
  84. *
  85. * This is an AF_XXX constant.
  86. */
  87. sa_family_t sa_family;
  88. /** Padding
  89. *
  90. * This ensures that a struct @c sockaddr_tcpip is large
  91. * enough to hold a socket address for any TCP/IP address
  92. * family.
  93. */
  94. char pad[ SA_LEN - sizeof ( sa_family_t ) ];
  95. } __attribute__ (( packed, may_alias ));
  96. /**
  97. * Socket address converter
  98. *
  99. */
  100. struct sockaddr_converter {
  101. /** Socket address family
  102. *
  103. * This is an AF_XXX constant.
  104. */
  105. sa_family_t family;
  106. /** Transcribe socket address
  107. *
  108. * @v sa Socket address
  109. * @ret string Socket address string
  110. */
  111. const char * ( * ntoa ) ( struct sockaddr *sa );
  112. /** Parse socket address
  113. *
  114. * @v string Socket address stringh
  115. * @v sa Socket address to fill in
  116. * @ret rc Return status code
  117. */
  118. int ( * aton ) ( const char *string, struct sockaddr *sa );
  119. };
  120. /** Socket address converter table */
  121. #define SOCKADDR_CONVERTERS \
  122. __table ( struct sockaddr_converter, "sockaddr_converters" )
  123. /** Declare a socket address converter */
  124. #define __sockaddr_converter __table_entry ( SOCKADDR_CONVERTERS, 01 )
  125. extern const char * sock_ntoa ( struct sockaddr *sa );
  126. extern int sock_aton ( const char *string, struct sockaddr *sa );
  127. #endif /* _IPXE_SOCKET_H */