msg.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /** @file msg.h
  2. *
  3. * @brief Library to implement simple network protocol
  4. *
  5. * Message (request or answer) has the following structure:
  6. *
  7. * [ Message header ]
  8. * [ First parameter's header ]
  9. * [ ... ]
  10. * [ N-th parameter's header ]
  11. * [ First parameter's data ]
  12. * [ ... ]
  13. * [ N-th parameter's data ]
  14. *
  15. * Message header has such standard fields as:
  16. * - Magic number
  17. * - Protocol version major number
  18. * - Protocol version minor number
  19. * - Command code
  20. * - Status
  21. * - Request ID field to identify session
  22. * - Number of parameters
  23. * - Whole message length
  24. *
  25. * The length of message can vary. Header has constant length and
  26. * contains total length of whole message and number of parameters. There are
  27. * parameter headers for each parameter. Parameter's header contains parameter
  28. * type and length of parameter. After parameter headers array the parameter's
  29. * data follows in a sequence.
  30. *
  31. * Multibyte header fields use network (big-endian) byte order.
  32. */
  33. #ifndef _faux_msg_h
  34. #define _faux_msg_h
  35. #include <stdint.h>
  36. #include <signal.h>
  37. #include <faux/faux.h>
  38. #include <faux/list.h>
  39. #include <faux/net.h>
  40. #include <faux/async.h>
  41. typedef struct faux_msg_s faux_msg_t;
  42. // Debug variable. BOOL_TRUE for debug and BOOL_FALSE to switch debug off
  43. extern bool_t faux_msg_debug_flag;
  44. /** @brief Parameter header
  45. */
  46. typedef struct faux_phdr_s {
  47. uint16_t param_type; // Parameter type
  48. uint8_t reserved[2];
  49. uint32_t param_len; // Length of parameter (not including header)
  50. } faux_phdr_t;
  51. /** @brief Message header
  52. */
  53. typedef struct faux_hdr_s {
  54. uint32_t magic; // Magic number
  55. uint8_t major; // Major protocol version number
  56. uint8_t minor; // Minor protocol version number
  57. uint16_t cmd; // Command
  58. uint32_t status; // Status
  59. uint32_t req_id; // Some abstract ID of request. Identifies request/answer
  60. uint32_t param_num; // Number of parameters
  61. uint32_t len; // Length of whole message (including header)
  62. faux_phdr_t phdr[]; // Parameter headers (unknown length)
  63. } faux_hdr_t;
  64. C_DECL_BEGIN
  65. // Header functions
  66. void faux_hdr_set_cmd(faux_hdr_t *hdr, uint16_t cmd);
  67. uint16_t faux_hdr_cmd(const faux_hdr_t *hdr);
  68. void faux_hdr_set_status(faux_hdr_t *hdr, uint32_t status);
  69. uint32_t faux_hdr_status(const faux_hdr_t *hdr);
  70. void faux_hdr_set_req_id(faux_hdr_t *hdr, uint32_t req_id);
  71. uint32_t faux_hdr_req_id(const faux_hdr_t *hdr);
  72. void faux_hdr_set_param_num(faux_hdr_t *hdr, uint32_t param_num);
  73. uint32_t faux_hdr_param_num(const faux_hdr_t *hdr);
  74. void faux_hdr_set_len(faux_hdr_t *hdr, uint32_t len);
  75. int faux_hdr_len(const faux_hdr_t *hdr);
  76. void faux_hdr_set_magic(faux_hdr_t *hdr, uint32_t magic);
  77. uint32_t faux_hdr_magic(const faux_hdr_t *hdr);
  78. void faux_hdr_set_major(faux_hdr_t *hdr, uint8_t major);
  79. uint8_t faux_hdr_major(const faux_hdr_t *hdr);
  80. void faux_hdr_set_minor(faux_hdr_t *hdr, uint8_t minor);
  81. uint8_t faux_hdr_minor(const faux_hdr_t *hdr);
  82. // Parameter functions
  83. void faux_phdr_set_type(faux_phdr_t *phdr, uint16_t param_type);
  84. uint16_t faux_phdr_get_type(const faux_phdr_t *phdr);
  85. void faux_phdr_set_len(faux_phdr_t *phdr, uint32_t param_len);
  86. uint32_t faux_phdr_get_len(const faux_phdr_t *phdr);
  87. // Message functions
  88. faux_msg_t *faux_msg_new(uint32_t magic, uint8_t major, uint8_t minor);
  89. void faux_msg_free(faux_msg_t *msg);
  90. void faux_msg_set_cmd(faux_msg_t *msg, uint16_t cmd);
  91. uint16_t faux_msg_get_cmd(const faux_msg_t *msg);
  92. void faux_msg_set_status(faux_msg_t *msg, uint32_t status);
  93. uint32_t faux_msg_get_status(const faux_msg_t *msg);
  94. void faux_msg_set_req_id(faux_msg_t *msg, uint32_t req_id);
  95. uint32_t faux_msg_get_req_id(const faux_msg_t *msg);
  96. uint32_t faux_msg_get_param_num(const faux_msg_t *msg);
  97. int faux_msg_get_len(const faux_msg_t *msg);
  98. uint32_t faux_msg_get_magic(const faux_msg_t *msg);
  99. int faux_msg_get_major(const faux_msg_t *msg);
  100. int faux_msg_get_minor(const faux_msg_t *msg);
  101. ssize_t faux_msg_add_param(faux_msg_t *msg, uint16_t type,
  102. const void *buf, size_t len);
  103. faux_list_node_t *faux_msg_init_param_iter(const faux_msg_t *msg);
  104. faux_phdr_t *faux_msg_get_param_each(faux_list_node_t **node,
  105. uint16_t *param_type, void **param_data, uint32_t *param_len);
  106. faux_phdr_t *faux_msg_get_param_by_index(const faux_msg_t *msg, unsigned int index,
  107. uint16_t *param_type, void **param_data, uint32_t *param_len);
  108. faux_phdr_t *faux_msg_get_param_by_type(const faux_msg_t *msg,
  109. uint16_t param_type, void **param_data, uint32_t *param_len);
  110. char *faux_msg_get_str_param_by_type(const faux_msg_t *msg,
  111. uint16_t param_type);
  112. ssize_t faux_msg_send(const faux_msg_t *msg, faux_net_t *faux_net);
  113. ssize_t faux_msg_send_async(const faux_msg_t *msg, faux_async_t *async);
  114. faux_msg_t *faux_msg_recv(faux_net_t *faux_net);
  115. bool_t faux_msg_iov(const faux_msg_t *msg, struct iovec **iov_out, size_t *iov_num_out);
  116. bool_t faux_msg_serialize(const faux_msg_t *msg, char **buf, size_t *len);
  117. faux_msg_t *faux_msg_deserialize_parts(const faux_hdr_t *hdr,
  118. const char *body, size_t body_len);
  119. faux_msg_t *faux_msg_deserialize(const char *data, size_t len);
  120. void faux_msg_debug(const faux_msg_t *msg);
  121. C_DECL_END
  122. #endif // _faux_msg_h