PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/src/host/descriptor/shd-socket.h

https://github.com/amiller/shadow
C Header | 110 lines | 80 code | 23 blank | 7 comment | 0 complexity | 5dc4647f0c5745555f9d07de17a43cb8 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. /*
  2. * The Shadow Simulator
  3. * Copyright (c) 2010-2011, Rob Jansen
  4. * See LICENSE for licensing information
  5. */
  6. #ifndef SHD_SOCKET_H_
  7. #define SHD_SOCKET_H_
  8. typedef struct _Socket Socket;
  9. typedef struct _SocketFunctionTable SocketFunctionTable;
  10. typedef gboolean (*SocketIsFamilySupportedFunc)(Socket* socket, sa_family_t family);
  11. typedef gint (*SocketConnectToPeerFunc)(Socket* socket, in_addr_t ip, in_port_t port, sa_family_t family);
  12. typedef void (*SocketProcessFunc)(Socket* socket, Packet* packet);
  13. typedef void (*SocketDropFunc)(Socket* socket, Packet* packet);
  14. struct _SocketFunctionTable {
  15. DescriptorFunc close;
  16. DescriptorFunc free;
  17. TransportSendFunc send;
  18. TransportReceiveFunc receive;
  19. SocketProcessFunc process;
  20. SocketIsFamilySupportedFunc isFamilySupported;
  21. SocketConnectToPeerFunc connectToPeer;
  22. SocketDropFunc dropPacket;
  23. MAGIC_DECLARE;
  24. };
  25. enum SocketFlags {
  26. SF_NONE = 0,
  27. SF_BOUND = 1 << 0,
  28. SF_UNIX = 1 << 1,
  29. SF_UNIX_BOUND = 1 << 2,
  30. };
  31. struct _Socket {
  32. Transport super;
  33. SocketFunctionTable* vtable;
  34. enum SocketFlags flags;
  35. enum ProtocolType protocol;
  36. in_addr_t peerIP;
  37. in_addr_t peerPort;
  38. gchar* peerString;
  39. in_addr_t boundAddress;
  40. in_port_t boundPort;
  41. gchar* boundString;
  42. gchar* unixPath;
  43. gint associationKey;
  44. /* buffering packets readable by user */
  45. GQueue* inputBuffer;
  46. gsize inputBufferSize;
  47. gsize inputBufferSizePending;
  48. gsize inputBufferLength;
  49. /* buffering packets ready to send */
  50. GQueue* outputBuffer;
  51. gsize outputBufferSize;
  52. gsize outputBufferSizePending;
  53. gsize outputBufferLength;
  54. MAGIC_DECLARE;
  55. };
  56. void socket_init(Socket* socket, SocketFunctionTable* vtable, DescriptorType type, gint handle,
  57. guint receiveBufferSize, guint sendBufferSize);
  58. void socket_pushInPacket(Socket* socket, Packet* packet);
  59. void socket_dropPacket(Socket* socket, Packet* packet);
  60. Packet* socket_pullOutPacket(Socket* socket);
  61. Packet* socket_peekNextPacket(const Socket* socket);
  62. gsize socket_getInputBufferSize(Socket* socket);
  63. void socket_setInputBufferSize(Socket* socket, gsize newSize);
  64. gsize socket_getInputBufferLength(Socket* socket);
  65. gsize socket_getInputBufferSpace(Socket* socket);
  66. gboolean socket_addToInputBuffer(Socket* socket, Packet* packet);
  67. Packet* socket_removeFromInputBuffer(Socket* socket);
  68. gsize socket_getOutputBufferSize(Socket* socket);
  69. void socket_setOutputBufferSize(Socket* socket, gsize newSize);
  70. gsize socket_getOutputBufferLength(Socket* socket);
  71. gsize socket_getOutputBufferSpace(Socket* socket);
  72. gboolean socket_addToOutputBuffer(Socket* socket, Packet* packet);
  73. Packet* socket_removeFromOutputBuffer(Socket* socket);
  74. gboolean socket_isBound(Socket* socket);
  75. gint socket_getAssociationKey(Socket* socket);
  76. gboolean socket_getPeerName(Socket* socket, in_addr_t* ip, in_port_t* port);
  77. void socket_setPeerName(Socket* socket, in_addr_t ip, in_port_t port);
  78. gboolean socket_getSocketName(Socket* socket, in_addr_t* ip, in_port_t* port);
  79. void socket_setSocketName(Socket* socket, in_addr_t ip, in_port_t port, gboolean isInternal);
  80. enum ProtocolType socket_getProtocol(Socket* socket);
  81. gboolean socket_isFamilySupported(Socket* socket, sa_family_t family);
  82. gint socket_connectToPeer(Socket* socket, in_addr_t ip, in_port_t port, sa_family_t family);
  83. gboolean socket_isUnix(Socket* socket);
  84. void socket_setUnix(Socket* socket, gboolean isUnixSocket);
  85. void socket_setUnixPath(Socket* socket, const gchar* path, gboolean isBound);
  86. gchar* socket_getUnixPath(Socket* socket);
  87. #endif /* SHD_SOCKET_H_ */