servers/lwip/socket.h

http://www.minix3.org/ · C Header · 135 lines · 103 code · 26 blank · 6 comment · 3 complexity · 1f9271e593b922a245ca1064b7c45098 MD5 · raw file

  1. #ifndef __LWIP_SERVER_SOCKET_H__
  2. #define __LWIP_SERVER_SOCKET_H__
  3. #include <minix/ipc.h>
  4. #include <minix/endpoint.h>
  5. #include "inet_config.h"
  6. #include "proto.h"
  7. #define SOCK_TYPE_IP 0
  8. #define SOCK_TYPE_TCP 1
  9. #define SOCK_TYPE_UDP 2
  10. #define SOCK_TYPES 3
  11. struct socket;
  12. typedef void (* sock_op_t)(struct socket *, message *);
  13. typedef int (* sock_op_open_t)(struct socket *, message *);
  14. struct sock_ops {
  15. sock_op_open_t open;
  16. sock_op_t close;
  17. sock_op_t read;
  18. sock_op_t write;
  19. sock_op_t ioctl;
  20. sock_op_t select;
  21. sock_op_t select_reply;
  22. };
  23. struct recv_q {
  24. struct recv_q * next;
  25. void * data;
  26. };
  27. #define SOCK_FLG_OP_PENDING 0x1
  28. #define SOCK_FLG_OP_REVIVING 0x2
  29. #define SOCK_FLG_OP_SUSPENDED 0x4 /* set when processing a suspended op */
  30. #define SOCK_FLG_OP_LISTENING 0x100 /* tcp socket is in a listening mode */
  31. #define SOCK_FLG_OP_CONNECTING 0x200 /* set when waiting for a connect */
  32. #define SOCK_FLG_OP_READING 0x400 /* reading operation in progress */
  33. #define SOCK_FLG_OP_WRITING 0x800 /* writing operation in progress */
  34. #define SOCK_FLG_CLOSED 0x1000 /* tcp socket has been closed do not
  35. expect any more data */
  36. /* select() flags - they say what action do we monitor */
  37. #define SOCK_FLG_SEL_WRITE 0x100000
  38. #define SOCK_FLG_SEL_READ 0x200000
  39. #define SOCK_FLG_SEL_ERROR 0x400000
  40. #define SOCK_FLG_SEL_CHECK 0x800000 /* select satisfied, go and check it */
  41. #define sock_select_set(sock) ((sock)->flags & (SOCK_FLG_SEL_WRITE | \
  42. SOCK_FLG_SEL_READ | SOCK_FLG_SEL_ERROR))
  43. #define sock_select_read_set(sock) ((sock)->flags & SOCK_FLG_SEL_READ)
  44. #define sock_select_write_set(sock) ((sock)->flags & SOCK_FLG_SEL_WRITE)
  45. #define sock_select_rw_set(sock) ((sock)->flags & (SOCK_FLG_SEL_READ | \
  46. SOCK_FLG_SEL_WRITE))
  47. #define sock_select_error_set(sock) ((sock)->flags & SOCK_FLG_SEL_ERROR)
  48. #define sock_select_check_set(sock) ((sock)->flags & SOCK_FLG_SEL_CHECK)
  49. #define sock_clear_select(sock) do { \
  50. (sock)->flags &= ~(SOCK_FLG_SEL_READ | SOCK_FLG_SEL_WRITE | \
  51. SOCK_FLG_SEL_ERROR | SOCK_FLG_SEL_CHECK); \
  52. } while (0)
  53. struct socket {
  54. int type;
  55. u32_t flags;
  56. unsigned long usr_flags;
  57. void * pcb;
  58. struct sock_ops * ops;
  59. void * buf;
  60. size_t buf_size;
  61. message mess; /* store the message which initiated the
  62. last operation on this socket in case
  63. we have to suspend the operation */
  64. endpoint_t select_ep;
  65. struct recv_q * recv_head;
  66. struct recv_q * recv_tail;
  67. unsigned recv_data_size; /* sum of data enqueued */
  68. void * data;
  69. };
  70. extern struct sock_ops sock_udp_ops;
  71. extern struct sock_ops sock_tcp_ops;
  72. extern struct sock_ops sock_raw_ip_ops;
  73. #define get_sock_num(x) ((long int) ((x) - socket))
  74. #define is_valid_sock_num(x) (x < MAX_SOCKETS)
  75. #define get_sock(x) &socket[x]
  76. #define MAX_SOCKETS 255 /* FIXME as log as the sockets are identified by the
  77. minor device number 255 is ok */
  78. #define MAX_DEVS 5
  79. #define RESERVED (SOCK_TYPES + MAX_DEVS) /* rounded to 8 */
  80. extern struct socket socket[MAX_SOCKETS];
  81. void socket_request(message * m);
  82. void mq_process(void);
  83. struct socket * get_unused_sock(void);
  84. struct socket * get_nic_sock(unsigned dev);
  85. void send_reply(message * m, int status);
  86. void sock_reply(struct socket * sock, int status);
  87. void sock_revive(struct socket * sock, int status);
  88. typedef void (* recv_data_free_fn)(void *);
  89. int sock_enqueue_data(struct socket * sock, void * data, unsigned size);
  90. void * sock_dequeue_data(struct socket * sock);
  91. void sock_dequeue_data_all(struct socket * sock,
  92. recv_data_free_fn data_free);
  93. void sock_select_notify(struct socket * sock);
  94. static inline void * debug_malloc(size_t s)
  95. {
  96. void * ret;
  97. ret = malloc(s);
  98. // printf("allocated %p size %d\n", ret, s);
  99. return ret;
  100. }
  101. #define debug_free(x) do { \
  102. if (0) \
  103. printf("free called from %s:%d %s freeing %p\n", __FILE__, \
  104. __LINE__, __func__, (x)); \
  105. free(x); \
  106. } while(0)
  107. void generic_op_select(struct socket * sock, message * m);
  108. void generic_op_select_reply(struct socket * sock, message * m);
  109. #endif /* __LWIP_SERVER_SOCKET_H__ */